【发布时间】:2013-03-09 17:43:11
【问题描述】:
我的网站上有一项功能,搜索结果中突出显示了搜索查询。但是,站点搜索的某些字段中包含 HTML。例如,假设我有一个由<span>Hello all</span> 组成的搜索结果。如果用户搜索字母a,我希望代码返回<span>Hello <mark>a</mark>all</span>,而不是现在返回的乱七八糟的<sp<mark>a</mark>n>Hello <mark>a</mark>ll</sp<mark>a</mark>n>。
我知道我可以在preg_replace() 中使用否定的后视和前瞻来排除a 介于< 和> 之间的任何实例。但是我该怎么做呢?正则表达式是我的弱点之一,我似乎想不出任何可行的方法。
到目前为止,我得到的是这样的:
$return = preg_replace("/(?<!\<[a-z\s]+?)$match(?!\>[a-z\s]+?)/i", '<mark>'.$match.'</mark>', $result);
但它似乎不起作用。有什么帮助吗?
【问题讨论】:
-
不要使用正则表达式解析 HTML。您无法使用正则表达式可靠地解析 HTML,并且您将面临悲伤和挫败感。一旦 HTML 与您的期望发生变化,您的代码就会被破坏。有关如何使用已经编写、测试和调试的 PHP 模块正确解析 HTML 的示例,请参阅 htmlparsing.com/php。
-
我明白了。如何使用解析模块对 HTML 字符串中的文本进行查找和替换?
-
使用 DomDocument 的可能解决方案:stackoverflow.com/questions/9335689/…
-
@SDC,该解决方案效果很好!谢谢!你想把它作为答案发布,以便我给你信用吗?
-
@TerranRich - 好吧,我真的不值得称赞,但无论如何我都会发布一个简短的答案。 :-) 等等……
标签: php html regex html-parsing preg-replace