正则表达式 - 负面前瞻与懒惰限制?

时间:2012-04-19 03:53:40

标签: php regex regex-lookarounds

我不是正则表达式专家,但几个小时后我就建立了这个正则表达式:

#\[url=(?!.*?<div onclick="unveil_spoiler.*?\[/url\])([^_\W]+?://.*?)\](.+?)\[/url\]#i

哪个不区分大小写:

\[url=(?!.*?<div onclick="unveil_spoiler.*?\[/url\])([^_\W]+?://.*?)\](.+?)\[/url\]

匹配[url=xxxx://yyyy]zzzz[/url]个模式,除非它在<div onclick="unveil_spoiler[url=之间包含[/url]字符串。

现在我正在尝试添加类似的检查,如果\[url.*?\]\[url=之间包含\[/url\],则不会返回匹配项。我尝试了很多方法,但我似乎找到了100%的工作方式。

首先,我尝试添加另一个与我的正则表达式中已经存在的非常类似的负向前瞻,它部分起作用,但是看起来好像前瞻直到行尾 - 直到最后\[/url\] - 对于每场比赛,我希望前瞻停在第一个\[/url\]作为捕获组。

这是一个用于调试的字符串:

[url=http://www.match.com]Match[/url][url=http://www.nomatch.com<div onclick="unveil_spoiler"]No match[/url][url=http://www.match.com]Match[/url][url=http://www.nomatch.com]<div onclick="unveil_spoiler" No match[/url]
[url=http://www.nomatch.com]No <div onclick="unveil_spoiler"match[/url][url=http://www.match.com]Match[/url][url=http://www.nomatch.com]No <div onclick="unveil_spoiler" match[/url][url=http://www.match.com]Match[/url]

[url=http://www.match.com]Match[/url][url=http://www.match.com][b]Match[/b][/url][url=http://www.match.com]Match[/url][url=http://www.match.com]Match[/url]

[url=http://www.thisshouldntmatch.com[url=http://www.match.com]Match[/url]This shouldn't match[/url]

[url=http://www.thisshouldntmatch.com[url=http://www.thisshouldntmatch.com[url=http://www.match.com]Match[/url]]This shouldn't match[/url]This shouldn't match[/url]

[url=http://www.thisshouldntmatch.com[url=http://www.match.com]Match[/url]This shouldn't match[/url][url=http://www.match.com]Match[/url]

[url=http://www.thisshouldntmatch.com]This shouldn't match[url=http://www.match.com]Match[/url][url=http://www.match.com]Match[/url][/url]

[url=http://www.match.com]Match[/url][url=http://www.match.com]Match[/url][url=http://www.match.com]Match[/url][url=http://www.match.com]Match[/url]

在帖子开头发布正则表达式,它将完美匹配第一行中的2个匹配项。现在我希望它在比赛中有\[url.*?\]时不返回比赛,我试过这个正则表达式:

\[url=(?!.*?\[url.*?\].*?\[/url.*?\])(?!.*?<div onclick="unveil_spoiler.*?\[/url\])([^_\W]+?://.*?)\](.+?)\[/url\]

而且:

\[url=(?!.*?(?:<div onclick="unveil_spoiler|\[url.*?\]).*?\[/url\])([^_\W]+?://.*?)\](.+?)\[/url\]

当匹配内有\[url.*?\]时,它不会返回匹配,但它也会停止匹配第一行(在示例字符串中)的第一个匹配(它应该是第一个正则表达式)一样)。也就是说,它只会匹配每行的最后一次有效匹配。

我认为这是一个问题,前瞻不会停留在第一个\[/url\],有没有办法让它懒惰/修复它?

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

我认为以下内容应该有效:

\[url=(?:(?!<div onclick="unveil_spoiler"|\[url.*?\].*?\[/url.*?\]).)*?([^_\W]+?://[^\[\]]*)\]((?:(?!\[/?url).)*)\[/url\]

http://rubular.com/r/7h9EJ0casb

答案 1 :(得分:1)

这有用吗?

\[url=[^\[<]*?\](?:(?!(\[url)|<).)*?\[\/url\]

http://regexr.com?30mna