parser: selezionare parola esatta

  • Creatore Discussione Creatore Discussione mano
  • Data di inizio Data di inizio

mano

Nuovo Utente
3 Lug 2008
23
0
0
ciao

ho creato un piccolo parser che mi permette di scansionare un testo, riconoscervi alcune parole chiave, contenute in un database, e rimaneggiarle in modo da renderle dei collegamenti ipertestuali. il tutto funziona bene. Unico problema, se una parola chiave è parte di una parola più grande, questa viene comunque fatta diventare un link.

Esempio:
la mia parola chiave è "control".
se nel testo ho la parola "controllare", che non è evidentemente parola chiave, il parser legge comunque la parola "control" e mi modifica il testo rendendo solo quella parte un collegamento così:
controllare

ora, io vorrei che il parser non modifichi una parola a meno che non sia esattamente quella, e non faccia parte di altre parole più lunghe.

scrivo di seguito la funzione:

PHP:
// Funzione modifica testo
function scan_text($value="",$tab_key)
{
   $keywords = safe_query("SELECT * FROM $tab_key");
   if (mysql_num_rows($keywords)){
      while($key = mysql_fetch_array($keywords)){
        $indirizzo = $key['indirizzo'];
        $key = str_ireplace("_"," ",$key['keyword']);
	
        // NUCLEO DEL PARSER
        $value = eregi_replace($key,"<a href=\"index.php?action=".strtolower($indirizzo)."\">".$key."</a>",$value);
      }
   }
   return $value;
}
 
Non ho capito una cosa: se $value è la stringa in cui effettuare la sostituzione e $tab_key è quello relativo alla tabella, come passi la variabile da cercare?
 
la variabile da cercare è registrata nella tabella $tab_key costituita da 3 colonne: ID, KEYWORD e INDIRIZZO, dove keyword è la parola chiave da cercare all'interno della stringa $value.
dopo il fetch array di $keywords, estrapolo l'indirizzo ($indirizzo) e la parola chiave, che rinomino $key dopo averla modificata con la riga qui sotto, in modo da sostituire gli underscore con spazi: questo perchè nel database la parola chiave composta da più tesrmini è registrata come parola1_parola2, mentre nel testo si troverà senza trattino.

PHP:
$key = str_ireplace("_"," ",$key['keyword']);

in effetti così com'è scritta la funzione, pecca un po' di scarsa leggibilità, ma ti assicuro che il passaggio della parola è corretto. Il problema era isolare la parola all'interno della stringa.

comunque sono in qualche modo a risolvere il problema utilizzando al posto di
PHP:
$value = eregi_replace($key,"<a href=\"index.php?action=".strtolower($indirizzo)."\">".$key."</a>",$value);
questa riga di codice:
PHP:
$value = preg_replace("/\b$key\b/i","<a href=\"index.php?action=".strtolower($indirizzo)."\">".$key."</a>",$value);

in questo modo sembra funzionare correttamente, evidenziando per esempio "control" anzichè "controller".
sostanzialmente dovevo utilizzare il modifier "\b" con la funzione preg_replace. Mi sembra che eregi_replace non supporti i modificatori. o sono io che sbaglio qualcosa?
 
Ultima modifica:

Discussioni simili