突出显示文本,但html标记除外

时间:2010-04-07 08:50:07

标签: php regex preg-replace

我正在使用下面的代码突出显示文本中的一些关键字:

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

该文字可能包含一些html标签,例如<img><strong>等。

除了html标签之间的文字外,如何突出显示“普通”文字?因为当用户搜索“img”时,<img>文字将突出显示,图片将不再有效。

3 个答案:

答案 0 :(得分:5)

使用某种DOM解析器。这不是你想用正则表达式做的事情。

答案 1 :(得分:2)

来自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);
}

当$ flag == 1时,替换函数应用于HTML之外。 当$ flag == -1时,替换函数将应用于HTML中。

应用于您的示例,它会提供如下内容:

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

享受! ;)

答案 2 :(得分:0)

基于@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);