PHP RegEx匹配文本不在锚标记

时间:2015-10-08 15:09:09

标签: php regex

正则表达式有点过头,但我正在努力学习。

我有一个正在运行的正则表达式,我在preg_replace中使用匹配字符串并将其替换为html链接。除非在锚标记中也有子标记,否则它会正确地避免匹配在锚标记内部。

这是(更新的)模式:

/(?!(?:[^<]+>|[^>]+<\/a>))\b(Match Me)\b/is

以及一些示例文本:

<a href="#">Don't Match Me <span>web</span></a>
<a href="#">Don't Match Me</a>
Match Me
<span>Match Me</span>

上述正则表达式将匹配第1行,第3行和第4行的文本。但是,我只想匹配3号和3号文本中的“匹配我”。第4行。

注意:我正在筛选的内容并没有像我的例子那样用线条整齐地分隔。事实上这是一段文字。

我愿意使用DOM,但我正在使用preg_replace的数组功能大量内容并应用多个替换,如下所示:

preg_replace($searchFor, $linkArray, $content);

其中$ searchFor和$ linkArray都是多维数组,相应的键分别包含模式和替换html。

感谢任何帮助!

3 个答案:

答案 0 :(得分:3)

使用正则表达式匹配HTML非常棘手。此处接受的答案不允许匹配在两个单独的锚标记之间的字符串,例如:

HTML:

<a href="#">Don't Match Me <span>web</span></a>
match me
<a href="#">Don't Match Me</a>match me<a href="#">Don't Match Me</a>

之前我使用过以下正则表达式,但这只适用于php: https://regex101.com/r/v0FfFC/1

答案 1 :(得分:1)

评论升级回答:

match me(?!.*?\<\/a\>) 

https://regex101.com/r/hH3rL1/1

答案 2 :(得分:0)

我改变你的正则表达式以寻找锚点并避免选择那条线。

/^(?!.*(\<a.*?\>)).*$/ism

https://regex101.com/r/kE4mJ0/1