【问题标题】:Regular Expression Negative Lookahead/Lookbehind to Exclude HTML from Find-and-Replace正则表达式负前瞻/后视从查找和替换中排除 HTML
【发布时间】: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


【解决方案1】:

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

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

can be found here in the answer to this related SO question 的一个很好的例子。

希望对您有所帮助。

【讨论】:

  • 这绝对有帮助。我重新编写了搜索功能来解析 HTML,而不仅仅是普通的 preg_replace()ing 关键字来用 span 标签包围它们。非常感谢!
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    相关资源
    最近更新 更多