为什么这个URL模式不匹配?

时间:2011-08-28 05:18:53

标签: php regex

我正在使用John Gruber在此daringfireball article中描述的模式来自动链接用户评论中的网址。

我在PHP中使用它来匹配URL,并希望它匹配单个TLD而没有www且没有尾部斜杠,但它似乎不起作用。

这是模式(可以在上面的文章中更详细地看到):

$pattern  = '#(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4})(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))#';

具体来说,我正在看这个特定的子模式:[a-z0-9.\-]+[.][a-z]{2,4}

此子模式单独工作,但作为较大模式的一部分,它与google.com不匹配。

2 个答案:

答案 0 :(得分:2)

[a-z0-9.\-]+[.][a-z]{2,4}按预期工作,但该模式的其余部分至少需要1个后续字符:

google.com/
google.com?lang=en-us
google.com#!foo/bar

你可以尝试允许尾部是可选的,但它可能反过来给你假阳性而不是排除假阴性:

$pattern  = '#...“”‘’])?)#';  # '...' for brevity
#                      ^

答案 1 :(得分:0)

适合我:

http://regexr.com?2uica

你确定你的PHP中没有任何东西可以绊倒你吗?

修改

这是因为完整模式希望在域名之前找到一些内容,例如http://www