PHP Regex - 如果包含单词(字符串)则取消匹配

时间:2012-04-18 03:08:11

标签: php regex regex-negation negative-lookahead

我已经尝试了很多方法来做到这一点,唯一一个似乎部分地做我想要的是String negation using regular expressionsHow to negate specific word in regex?中描述的先行否定,但是我无法让它工作用我现在的正则表达式。

假设我有这个字符串:

[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\]

(这两个正则表达式应该对我的应用程序产生相同的影响,因为我可以很容易地适应它,所以如果它更有意义的话,可以使用后者)

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

我认为可以通过负向前瞻来完成,但我似乎找不到将其插入当前正则表达式而不会使其无法使用的方法。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

这应该可以解决问题。

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