Autor Zpráva
gogy27
Profil
Dobrý deň,
existuje nejaký skript, ktorým by sa dalo vypísať pár slov pred a pár slov po zadaní určitého slova, ktoré hľadám v databáze.
Príklad: V databáze mám vetu: Zajtra je streda a preto si ju na 100% uzijem.
Do vyhľadávania dám: streda
Vypíše sa výsledok ...je streda a preto...

Ďakujem za každý nápad a pomoc.
Prajem pekný zvyšok dňa.
Martin02
Profil
gogy27:
<?php
  $zadany_retezec = "streda";
  $veta = "Zajtra je streda a preto si ju na 100% uzijem.";
  $pole = split(' ', $veta);
  $delka = sizeof($pole) - 1;
  
  for($i = 0; $i <= $delka; $i++) {
    if($pole[$i] == $zadany_retezec ) {
      $num = $i;
      continue;
    }
  }
  
  $b2 = $num - 2; 
  $b1 = $num - 1;
  $n2 = $num + 2; 
  $n1 = $num + 1;
  
  echo $pole[$b2].' '.$pole[$b1].' '.$pole[$num].' '.$pole[$n1].' '.$pole[$n2];
?>

Do $zadany_retezec si musíš dát to slovo, které chceš hledat ve větě. Větu si určíš v $veta. Šlo by tam ještě napojit něco, aby to kontrolovalo, jestli nebylo zadáno slovo na začátku nebo na konci věty, což by hlásilo chybu.
Tori
Profil
gogy27:
Jak dlouhé jsou ty texty v DB? Napadá mě kombinace substr + locate v MySQL, ale možná by bylo jednodušší v MySQL pouze najít odpovídající řádky (asi využijete fulltext.index) a v PHP z nich regulárem vytáhnout hledaný řetězec + kus okolo něj. Při dlouhých textech to ale bude dost zpomalovat.
edit: Zkuste trochu googlit, "mysql search phrase with context" najde zajímavé odkazy.
gogy27
Profil
Martin02:
Nebol by problem v tvojom algoritme v tom, ze ak by nejake slovo sa nachadzalo dvakrat, tak vo vysledku to bude brat iba to druhe slovo?

//sorry, ze pisem bez diakritiky, som na mobile
Martin02
Profil
gogy27:
Ano, to by byl. Dělal jsem to narychlo, jen abych ukázal, jak by to šlo udělat.
gogy27
Profil
Našiel som si funkciu, ktorá by mi vyhovovala, napríklad: SELECT LEFT(text, LOCATE('$slovo',text,50)) AS kontext FROM clanky
Ale neviem ju zakomponovať do môjho skriptu.

 //Overime ci bolo stlacene tlacitko HLADAT
  $find = $_GET["find"];
 if (isset($find)) 
 { 
 
 // chyby si vynulujeme
 $chyby = "";

 // Trosku upravime vlozene slovo 
  $find = strip_tags($find); 
  $find = trim ($find);
 if ($find == "") { $chyby .= "Nezadali ste žiadne slovo.<br>"; }  
 if (strlen($find) <=3) { $chyby .="Zadané slovo musí obsahovať najmenej 4 znaky.<br>"; }
 if (strlen($find) >= 50) { $chyby .="Zadané slovo musí obsahovať maximálne 49 znakov.<br>"; }
 
 
 //Skript na vyhladavanie v databaze
  $pole_find = explode(" ", $find);  
  $pocet_find = count($pole_find);
  $pole_stlpce = array(0 => "nadpis", 1 => "text", 2=> "odsek");
  $a = 0;
  $b = 0;
  
  $query = "SELECT * FROM clanky WHERE (";
  $pocet_stlpce = count($pole_stlpce);
  while ($a < $pocet_stlpce)
  {
    while ($b < $pocet_find)
    {
      $query = $query."$pole_stlpce[$a] LIKE '%$pole_find[$b]%'";
      $b++;
      if ($b < $pocet_find)
      {
        $query = $query." AND ";
      }
    }
    $b = 0;
    $a++;
    if ($a < $pocet_stlpce)
    {
      $query = $query." COLLATE 'utf8_general_ci') OR (";
    }
  }
  $query = $query." COLLATE 'utf8_general_ci')";
    
    
    // overíme a získame počet výsledkov
  $sql = mysql_query($query);
  $celkem=mysql_num_rows($sql); 
 if ($celkem == 0) 
 { 
 $chyby.="Zadané slovo sa v databáze nenachádza<br>";
 }
  
    if (!isset($_GET["od"])) $od=1; else $od=$_GET["od"];
      if ($od >= 11) { $od = $od - $od%10; }
      $pomoc=$od-1;

$query = $query." LIMIT $pomoc, 10"; 
$data = mysql_query($query); 


echo '
<form method="GET" action="search.php">
       <input type="text" name="find" size=60 style="border:1px #ccc solid; margin: 5px auto;" value="'. $find .'"/>
        <span style="white-space: nowrap;"><input type="submit" value="Vyhľadať" style="text-align:center; margin:5px 2px 5px 4px; color: #026875; cursor:pointer; cursor:hand" /></span>
        </form>';
        
if ($chyby == ''){        
 while($result = mysql_fetch_array( $data )) 
 { 
  switch ($result["kategoria"]) {
  case 1: $adresar =''; break; 
  case 2: $adresar='pojmy/'; break;
  case 3: $adresar='vzory/'; break; 
  case 4: $adresar='predpisy/'; break; 
  }
  echo '<a href="../'.$adresar.'index.php?ic='. $result["id"] .'" title="Čítaj viac" class="nadpis">'.$result["nadpis"].'</a><br>'; 
                              
} 
}
else { 
  echo "<p style='color:red;'>$chyby</p>";
  }

 }

Tam v tom cykle, ako vypisujem nadpisy, tak by som rád pod to dal tú určitú časť textu, lenže problém je, že neviem ako to tam zakomponovať.

Rozmýšľal som pomocou explode si celý článok rozsekať na slová, no ak by bolo slovo na konci vety a za nim by bola bodka, alebo otáznik, tak už by bol problém. Tak som rozmýšľal, že budem overovať znak po znaku a aby napríklad slovo "streda" sa rozdelilo na zvlášť znaky a by sa hľadalo, či je v texte daná postupnosť znakov, no to by asi zabralo strašne veľa času pre spracovanie.
Nevedel by niekto niečo iné, jednoduchšie poradiť?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0