我正在尝试在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`
答案 0 :(得分:2)
您可以使用negative lookahead:
/count(?!<\/a>)(?!&)/i
匹配:周期 计数 存储为<a href="poem://plaspoem/POEM?LOC=MAIN&CMD=VIEW&KEY=CYCLE COUNT&REV=A">Cycle count</a>
这是 计数 的记录周期的 计数 强>
对于您的第二个请求,您只需使用负面预测即可忽略后跟空格的单词并且&#39; time&#39;:
count(?!&)(?!\stime)
匹配:周期 计数 存储为<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
子字符串1>}或</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>