我使用下面的代码突出显示文本的一些关键字:突出显示文本,除了HTML标签
$message = str_ireplace($words,'<span class="hightlighted_text">'.$words.'</span>',$message);
文本可能包含某些HTML标记,例如<img>
,<strong>
等。
如何突出显示“正常”文本,但html标记之间的文本除外?因为当用户搜索“img”时,<img>
文本将突出显示,并且图像不再有效。
我使用下面的代码突出显示文本的一些关键字:突出显示文本,除了HTML标签
$message = str_ireplace($words,'<span class="hightlighted_text">'.$words.'</span>',$message);
文本可能包含某些HTML标记,例如<img>
,<strong>
等。
如何突出显示“正常”文本,但html标记之间的文本除外?因为当用户搜索“img”时,<img>
文本将突出显示,并且图像不再有效。
使用某种类型的DOM解析器。这不是你想用正则表达式做的事情。
从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);
}
当$标志== 1,更换功能外HTML应用。 当$ flag == -1时,替换函数应用于HTML内部。
适用于你的榜样,它会给这样的:
echo split_tag($words, '<span class="hightlighted_text">'.$words.'</span>', $message, 'str_ireplace', 1);
享受! )
更好的代码从@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);
http://stackoverflow.com/questions/2590862/match-multiple-terms-within-body-tags/2590969#2590969(只是一个小时前!) – bobince 2010-04-07 09:27:26