0

我的网站上有一项功能,搜索结果中突出显示了搜索查询。但是,该站点搜索的某些字段中包含 HTML。例如,假设我的搜索结果由<span>Hello all</span>. 如果用户搜索 letter a,我希望代码返回而不是现在返回<span>Hello <mark>a</mark>all</span>的混乱。<sp<mark>a</mark>n>Hello <mark>a</mark>ll</sp<mark>a</mark>n>

我知道我可以使用否定的lookbehinds 和lookaheads inpreg_replace()来排除aa<>. 但是我该怎么做呢?正则表达式是我的弱点之一,我似乎无法提出任何工作。

到目前为止,我得到的是:

$return = preg_replace("/(?<!\<[a-z\s]+?)$match(?!\>[a-z\s]+?)/i", '<mark>'.$match.'</mark>', $result);

但这似乎不起作用。有什么帮助吗?

4

2 回答 2

1

如果您确实想使用正则表达式,则只需要一个简单的否定前瞻(假设格式良好的标记没有标签<>标签之内或之间)

$return = preg_replace("/$match(?![^<>]*>)/i", '<mark>$0</mark>', $result);

任何特殊的正则表达式字符$match都需要正确转义。

于 2013-03-20T15:10:50.413 回答
1

使用正则表达式解析 HTML 等复杂语言被认为是不好的做法。有足够的技能和耐心,以及先进的正则表达式引擎,这可能是可能的,但潜在的陷阱是巨大的,性能不太可能很好。

更好的解决方案是使用 dom 解析器,例如 PHP 的内置DOMDocument类。

在这个相关的 SO question 的答案中可以找到一个很好的例子。

希望有帮助。

于 2013-03-20T16:27:18.920 回答