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

Php 突出显示文本,html标记除外,php,regex,preg-replace,Php,Regex,Preg Replace,我使用下面的代码突出显示文本中的一些关键字: $message = str_ireplace($words,'<span class="hightlighted_text">'.$words.'</span>',$message); $message=str_-ireplace($words,.$words.',$message); 文本可能包含一些html标记,例如,等 除了html标记之间的文本外,如何突出显示“普通”文本?因为当用户搜索“img”时,文本将高亮显

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

$message = str_ireplace($words,'<span class="hightlighted_text">'.$words.'</span>',$message);
$message=str_-ireplace($words,.$words.',$message);
文本可能包含一些html标记,例如


除了html标记之间的文本外,如何突出显示“普通”文本?因为当用户搜索“img”时,
文本将高亮显示,图像不再工作。

使用某种DOM解析器。这不是您想对正则表达式执行的操作。

From

函数mon\u rplc\u回调($capture){ 全球$arg; 返回($arg['flag']==1) ?$arg['fct']($arg['from'],$arg['to'],$capture[1])。$capture[2] :$capture[1]。$arg['fct']($arg['from'],$arg['to'],$capture[2]); } 函数拆分标签($from、$to、$txt、$fct、$flag=1){ 全球$arg; $arg=compact('from','to','fct','flag'); 返回preg_replace_callback(“#”((?:(?!])*>|$)#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);
echo split_标记($words,.$words.',$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);
$str='';
$highlightWhat=“ba”;
$str=preg_replace_回调('#((?:(?!])*>|$)| si',函数($m)使用($highlightWhat){
返回preg_replace(“~(“$highlightWhat.”)~i',“$1',$m[1])。$m[2];
},
$str);

(一小时前!)谢谢,但这没有html解析器。上面的海报说,在这种情况下,html解析器会更好(??),我告诉你正则表达式可以做得很好。另外,你不需要有效的html代码:它只会工作。谢谢你的回复。唯一的问题是当取消关键字时(必须强调这一点)包含所有字母数字字符。我得到一个内存泄漏错误。嗯。这看起来很奇怪。你能提供你使用的代码吗?顺便说一句,我刚刚读了关于为什么正则表达式不能解析HTML的论点。我完全同意整件事,但这里的问题要简单得多:我们只需要知道我们是否在某个HTML标记内。我们不需要PAR我们只知道HTML标记介于<和>之间。我相信正则表达式在这里非常适合。
$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);