php中的负面lookbehind和贪婪量词

Sea*_*lan 5 php regex negative-lookbehind

我正在使用正则表达式来查找任何URL并相应地链接它们.但是,我不希望链接任何已链接的URL,因此我使用lookbehind来查看URL之前是否有href.但这失败了,因为PHP的前瞻和后瞻不允许使用可变长度量词.

这是匹配的正则表达式:

/\b(?<!href\s*=\s*[\'\"])((?:http:\/\/|www\.)\S*?)(?=\s|$)/i
Run Code Online (Sandbox Code Playgroud)

解决这个问题的最佳方法是什么?

编辑:

我还没有对它进行测试,但我认为在单个正则表达式中进行此操作的技巧是在正则表达式中使用条件表达式,这是PCRE支持的.它看起来像这样:

/(href\s*=\s*[\'\"])?(?(1)^|)((?:http:\/\/|www\.)\w[\w\d\.\/]*)(?=\s|$)/i
Run Code Online (Sandbox Code Playgroud)

关键点在于,如果捕获了href,则由于条件而立即抛出匹配(?(1)^|),这保证不匹配.可能有些问题.我明天会测试一下.

Nik*_*kiC 2

我尝试以相反的方式做同样的事情:确保 URL 不以以下形式结尾">

/((?:http:\/\/|www\.)(?:[^"\s]|"[^>]|(*FAIL))*?)(?=\s|$)/i
Run Code Online (Sandbox Code Playgroud)

但对我来说这看起来很老套,我相信你可以做得更好。

我的第二种方法与您的方法更相似(因此更精确):

/href\s*=\s*"[^"]*"(*SKIP)(*FAIL)|((?:http:\/\/|www\.)\S*?)(?=\s|$)/i
Run Code Online (Sandbox Code Playgroud)

如果我找到一个href=(*SKIP)(*FAIL)。这意味着当正则表达式引擎遇到(*SKIP).

但这同样很麻烦,而且我确信还有更好的选择。