2010-04-07 12 views
6

Sto usando il codice seguente per evidenziare alcune parole chiave in un testo:Evidenziare il testo, tranne i tag html

$message = str_ireplace($words,'<span class="hightlighted_text">'.$words.'</span>',$message); 

Il testo può contenere alcuni tag html, ad esempio <img>, <strong>, ecc ..

Come posso evidenziare il testo "normale", ad eccezione del testo tra i tag html? Perché quando gli utenti cercano "img" il testo <img> verrà evidenziato e l'immagine non funzionerà più.

+0

http://stackoverflow.com/questions/2590862/match-multiple-terms-within-body-tags/2590969#2590969 (solo un ora fa!) – bobince

risposta

5

Utilizzare un parser DOM di qualche tipo. Questo non è qualcosa che vuoi fare con regex.

2

Da http://forum.phpfrance.com/vos-contributions/remplacement-selectif-hors-dans-balises-html-t199.html

function mon_rplc_callback($capture){ 
    global $arg; 
    return ($arg['flag'] == 1) 
    ? $arg['fct']($arg['from'], $arg['to'], $capture[1]).$capture[2] 
    : $capture[1].$arg['fct']($arg['from'], $arg['to'], $capture[2]); 
} 

function split_tag($from, $to, $txt, $fct, $flag = 1){ 
    global $arg; 
    $arg = compact('from', 'to', 'fct', 'flag'); 
    return preg_replace_callback('#((?:(?!<[/a-z]).)*)([^>]*>|$)#si', "mon_rplc_callback", $txt); 
} 

Quando $ bandiera == 1, la funzione di sostituzione applicato al di fuori HTML. Quando $ flag == -1, la funzione di sostituzione viene applicata all'interno dell'HTML.

applicato al tuo esempio, sarebbe dare qualcosa di simile:

echo split_tag($words, '<span class="hightlighted_text">'.$words.'</span>', $message, 'str_ireplace', 1); 

Enjoy! ;)

+0

Grazie, ma questo è senza un parser html. I suddetti poster dicevano che un parser html sarebbe meglio in questo caso (??) – Arjen

+0

E vi dico che le espressioni regolari possono fare un ottimo lavoro. Inoltre non avrai bisogno di avere un codice html valido: funzionerà. – Savageman

+0

Grazie per la risposta. L'unico problema è quando de parole chiave (che devono essere evidenziate) contiene tutti i caratteri alfanumerici ottengo un errore di perdita di memoria. – Arjen

0

Meglio codice basato sulla risposta da @Savageman

$str = '<a href="ba">ba</a>'; 
$highlightWhat = "ba"; 
$str = preg_replace_callback('#((?:(?!<[/a-z]).)*)([^>]*>|$)#si', function($m) use ($highlightWhat) { 
      return preg_replace('~('.$highlightWhat.')~i', '<span style="background:#fff330">$1</span>', $m[1]) . $m[2]; 
     }, 
     $str); 
Problemi correlati