【问题标题】:Need variable width negative lookbehind replacement需要可变宽度负后视替换
【发布时间】:2010-04-27 21:43:40
【问题描述】:

我在这里(以及更多网站)查看了许多问题,并提供了一些提示,但没有一个给我明确的答案。我知道正则表达式,但我远非大师。这个特定的问题涉及 PHP 中的正则表达式。

我需要找到文本中未被给定类的超链接包围的单词。例如,我可能有

This <a href="blabblah" class="no_check">elephant</a> is green and this elephant is blue while this <a href="blahblah">elephant</a> is red.

我需要匹配第二只和第三只大象,而不是第一只(由测试类“no_check”标识)。请注意,可能有更多属性,而不仅仅是超链接中的 href 和 class。我想出了

((?<!<a .*class="no_check".*>)\belephant\b)

它在正则表达式测试软件中运行良好,但在 PHP 中却不行。

非常感谢任何帮助。如果您不能提供正则表达式,但可以找到某种 PHP 代码逻辑来规避对它的需求,我将同样感激。

【问题讨论】:

  • 请明确您希望输出的内容。

标签: php regex lookbehind negative-lookbehind


【解决方案1】:

如果可变宽度的负后瞻不可用,一个快速而肮脏的解决方案是反转内存中的字符串并使用可变宽度的负前瞻来代替。然后再次反转字符串。

但是使用 HTML 解析器可能会更好。

【讨论】:

    【解决方案2】:

    我认为最简单的方法是将或者一个完整的&lt;a&gt; 元素与“no_check”属性匹配,或者您正在搜索的单词。例如:

    <a [^<>]*class="no_check"[^<>]*>.*?</a>|(\belephant\b)
    

    如果是您匹配的单词,它将在捕获组 #1 中;如果不是,则该组应为空或 null。

    当然,我所说的“最简单的方法”实际上是指最简单的 regex 方法。更简单的是使用 HTML 解析器。

    【讨论】:

      【解决方案3】:

      我最终使用了混合解决方案。事实证明,我必须解析特定关键字的文本并检查它们是否已经是链接的一部分,如果不是,则将它们添加到超链接中。此处提供的解决方案非常有趣,但并不能完全满足我的需要。

      虽然使用 HTML 解析器的想法很好,我目前正在另一个项目中使用它。非常感谢 Alan Moore 和 Eric Strom 提出的解决方案。

      【讨论】:

        猜你喜欢
        • 2020-06-11
        • 1970-01-01
        • 2018-01-10
        • 2015-06-01
        • 1970-01-01
        • 2019-09-19
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        相关资源
        最近更新 更多