下面是匹配URL一个很长的正则表达式:
(?i)\b((?:(?:[a-z][\w-]+:)?(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))
的,扩大的版本(以帮助它理解):
(?xi)
\b
( # Capture 1: entire matched URL
(?:
(?:[a-z][\w-]+:)? # URL protocol and colon
(?:
/{1,3} # 1-3 slashes
| # or
[a-z0-9%] # Single letter or digit or '%'
# (Trying not to match e.g. "URI::Escape")
)
| # or
www\d{0,3}[.] # "www.", "www1.", "www2." … "www999."
| # or
[a-z0-9.\-]+[.][a-z]{2,4}/ # looks like domain name followed by a slash
)
(?: # One or more:
[^\s()<>]+ # Run of non-space, non-()<>
| # or
\(([^\s()<>]+|(\([^\s()<>]+\)))*\) # balanced parens, up to 2 levels
)+
(?: # End with:
\(([^\s()<>]+|(\([^\s()<>]+\)))*\) # balanced parens, up to 2 levels
| # or
[^\s`!()\[\]{};:'".,<>?«»“”‘’] # not a space or one of these punct chars
)
)
这些都来自this page,但略作修改为了使协议正确可选 - 您应该阅读该页面以帮助了解它在做什么,并且它还有一个只与基于Web的URL匹配的变体,您可能也需要查看它。
感谢您对您的所有答复。工作很好。 – NLV 2010-08-03 12:24:53
你所有的正则表达式都接受@@ ## $$作为有效的URL。有任何想法吗? – NLV 2010-08-04 06:49:06
NLV,你没有指定你希望我们纠正你的正则表达式,你只是问如何改变它来接受任何协议。 无论如何,请参阅下面我的新答案,它给出了一个完整的(和复杂的)URL验证正则表达式。 – 2010-08-06 20:00:05