PHP 正则表达式 - 如果匹配项包含单词(字符串),则否定匹配项

PHP Regex - negate a match if it contains a word (string)

提问人:Fabrício Matté 提问时间:4/18/2012 最后编辑:CommunityFabrício Matté 更新时间:4/18/2012 访问量:4975

问:

我尝试了很多方法来做到这一点,唯一似乎部分做到了我想要的方法是使用正则表达式的字符串否定和如何在正则表达式中否定特定单词? 但我无法让它与我当前的正则表达式一起使用。

假设我有这个字符串:

[url=http://www.example.com]this url BB tag should match[/url]
[url=http://www.example.com][spoiler]this url BB tag shouldn't match[/spoiler][/url]

编辑:更深入的字符串,不应返回用于调试的匹配项:

[url=http://www.example.com]Lorem[spoiler]this url BB tag shouldn't match[/spoiler]Ipsum[/url]

而当前的正则表达式模式:

#\[url=([\w]+?://.*?)\]([^?\n\r\t].*?)\[/url\]#is

编辑:我正在使用以下正则表达式(没有#和 #is)在Regex Buddy上调试它:

\[url=([\w]+?://.*?)\]([^?\n\r\t].*?)\[/url\]

(这 2 个正则表达式应该对我的应用程序产生相同的效果,因为我可以轻松适应它,因此如果更有意义,请使用后者)

将匹配字符串中的两行。我希望当 和 之间有字符串时,它不会返回匹配项。[spoiler][url=xxxx://yyyy][/url]

我认为这可以通过消极的展望来完成,但我似乎找不到一种方法将其插入当前正则表达式而不使其无法使用。

任何帮助都是值得赞赏的。

php 否定 正则表达式-lookarounds

评论


答:

1赞 Rezigned 4/18/2012 #1

这应该可以解决问题。

'#\[url=([^\]]+)\](?!\[spoiler\])(.*?)\[/url\]#'

评论

0赞 Fabrício Matté 4/18/2012
它仍然在我的 php 和正则表达式测试器上返回匹配项。[url=http://www.google.com][spoiler][/spoiler][/url]
0赞 Rezigned 4/18/2012
这是我的测试,它不返回任何内容(这是你想要的)。preg_match('#\[url=([^\]]+)\](?!\[spoiler\])(.*?)\[/url\]#', '[url=http://www.google.com][spoiler][/spoiler][/url]', $m); print_r($m);
0赞 Fabrício Matté 4/18/2012
哦,对不起,对于我上面的评论,它实际上不会返回您的正则表达式的匹配项,但是,如果我在 之前添加任何字符,它将返回匹配项:[spoiler][url=http://wwww.google.com]Hi[spoiler][/spoiler][/url]
0赞 Fabrício Matté 4/18/2012
在前瞻中添加一个 .* 似乎可以解决问题,我将对其进行调试并发布结果。
1赞 Fabrício Matté 4/18/2012
好吧,lookahead 可以解决问题,但我仍然想保留 \w 迭代和 :// 检查此模式,所以这是最终的正则表达式:.感谢您的帮助。(?!.*\[spoiler\])#\[url=(?=[^_\W]+?://)([^\]]+)\](?!.*\[spoiler\])(.*?)\[/url\]#i