需要可变宽度负向后视替换

时间:2010-04-27 21:43:41

标签: php regex lookbehind negative-lookbehind

我在这里看了很多问题(以及更多网站),有些提供了提示,但没有一个给我一个明确的答案。我知道正则表达式,但我远不是一个古茹。这个特殊问题涉及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和类。我想出了

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

在regex测试软件中运行得非常好,但在PHP中却没有。

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

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

当然,通过“最简单的方法”,我的意思是最简单的正则表达式方法。更简单的是使用HTML解析器。

答案 2 :(得分:1)

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

使用HTML解析器的想法虽然很好,但我目前正在另一个项目中使用。因此,艾伦·摩尔和埃里克斯特罗姆都提出了解决方案的建议。