突出显示文本,html 标签除外

发布于 2024-08-27 22:57:53 字数 350 浏览 10 评论 0原文

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

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

文本可能包含一些 html 标签,例如 等..

如何突出显示“正常”文本(html 标记之间的文本除外)?因为当用户搜索“img”时, 文本将突出显示,并且图像不再起作用。

I'm using the code below to highlight some keywords in a text:

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

The text may contain some html tags, for example <img>, <strong>, etc..

How can I highlight "normal" text, except the text between the html tags? Because when users search for "img" the <img> text will be highlighted and the image doesn't work anymore.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

拥醉 2024-09-03 22:57:53

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

Use a DOM parser of some sort. This is not something you want to do with regex.

原野 2024-09-03 22:57:53

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

享受! ;)

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

When $flag == 1, the replacement function is applied outside HTML.
When $flag == -1, the replacement function is applied inside HTML.

Applied to your example, it would give something like this:

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

Enjoy! ;)

生活了然无味 2024-09-03 22:57:53

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

Better code based on reply from @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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文