2010-04-07 4 views
6

J'utilise le code ci-dessous pour mettre en évidence certains mots-clés dans un texte:Sélectionnez le texte, à l'exception des balises HTML

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

Le texte peut contenir des balises html, par exemple <img>, <strong>, etc ..

Comment puis-je mettre en évidence le texte "normal", à l'exception du texte entre les balises html? Parce que lorsque les utilisateurs recherchent "img" le texte <img> sera mis en surbrillance et l'image ne fonctionne plus.

+0

http://stackoverflow.com/questions/2590862/match-multiple-terms-within-body-tags/2590969#2590969 (juste un il ya une heure!) – bobince

Répondre

5

Utilise un analyseur DOM quelconque. Ce n'est pas quelque chose que vous voulez faire avec regex.

2

De 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); 
} 

Lorsque $ drapeau == 1, la fonction de remplacement est appliquée en dehors HTML. Lorsque $ flag == -1, la fonction de remplacement est appliquée dans le code HTML.

Appliqué à votre exemple, cela donnerait quelque chose comme ceci:

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

Enjoy! ;)

+0

Merci, mais c'est sans un analyseur html. Les affiches ci-dessus ont dit qu'un analyseur html serait mieux dans ce cas (??) – Arjen

+0

Et je vous dis que les expressions régulières peuvent faire un très bon travail. De plus, vous n'aurez pas besoin d'un code html valide: cela fonctionnera. – Savageman

+0

Merci pour votre réponse. Le seul problème est lorsque les mots-clés (qui doivent être surlignés) contiennent tous les caractères alphanumériques. Je reçois une erreur de fuite de mémoire. – Arjen

0

Code meilleure base de la réponse de @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); 
Questions connexes