排除在锚文本中找到的结果

时间:2016-10-07 14:05:26

标签: php regex preg-match

我正在尝试在php中使用正则表达式来查找所有单词计数,不包括位于锚文本中的单词

我从/ \ b(计数)\ b / i开始,但不能完全得到我需要的东西

Cycle count Stored as a <a href="poem://plaspoem/POEM?LOC=MAIN&CMD=VIEW&KEY=CYCLE COUNT&REV=A">Cycle count</a> which is a count of records Cycle count`

2 个答案:

答案 0 :(得分:2)

您可以使用negative lookahead

/count(?!<\/a>)(?!&)/i

匹配:周期 计数 存储为<a href="poem://plaspoem/POEM?LOC=MAIN&CMD=VIEW&KEY=CYCLE COUNT&REV=A">Cycle count</a>这是 计数 的记录周期的 计数

EXAMPLE

对于您的第二个请求,您只需使用负面预测即可忽略后跟空格的单词并且&#39; time&#39;:

count(?!&)(?!\stime)

EXAMPLE

匹配:周期 计数 存储为<a href="poem://plaspoem/POEM?LOC=MAIN&CMD=VIEW&KEY=CYCLE COUNT&REV=A">Cycle count time</a>这是 计数 的记录周期的 计数

现在,一句警告:如果你不知道会跟随什么词,那就非常脆弱了。在括号内使用时。

答案 1 :(得分:0)

请注意,如果您拥有正确,有效的HTML代码,则可能始终依赖于PHP DOMDocument和XPath。由于字符串不是有效的HTML,因此您可以使用正则表达式。

  

我不知道可以跟随什么或多少单词&#39; count&#39; (如果有的话)链接

如果您使用count(?!<\/a>)(?!&)模式,它只会失败{em>立即后面的count子字符串}或</a>(注意表达式与&)相同。

要在单词count(?!(?:<\/a>|&))之后允许任何0+个字符,以避免在count标记上溢出,您需要使用</a>构造匹配除{{之外的0+或更多字符1}}在前瞻内部。

[^<]*

请参阅regex demo

正则表达式将匹配除了<之外没有跟随0 +字符然后'~\bcount\b(?![^<]*</a>)~' 的所有整个单词count

另一种方法更合适:我们匹配所有<代码并跳过它们,并且只匹配其他文本中的整个单词</a>

a

请参阅another demo

此处,count部分与'~<a\b[^<]*?>[^<]*</a>(*SKIP)(?!)|\bcount\b~' 以外的<a\b[^<]*?>[^<]*</a>(*SKIP)(?!) + 0+个字符匹配尽可能少的次数,直至第一个<a,然后<匹配锚文本和>匹配关闭标记,此匹配文本将被删除,并且在该锚标记之后搜索整个单词[^<]*的下一个匹配项。

A PHP demo

</a>