这是正则表达式完美的任何网址?
preg_match_all(
'/([www]+(\.|dot))?[a-zA-Z0-9_\.-]+(\.|dot){1,}[com|net|org|info\.]+((\.|dot){0,}[a-zA-Z]){0,}+/i',
$url, $regp);
这是正则表达式完美的任何网址?
preg_match_all(
'/([www]+(\.|dot))?[a-zA-Z0-9_\.-]+(\.|dot){1,}[com|net|org|info\.]+((\.|dot){0,}[a-zA-Z]){0,}+/i',
$url, $regp);
[www]+
应改变(www)?
(\.|dot){1,}
- 一个多? mayby你想要做([a-zA-Z0-9_\.-]+(\.|dot)){1,}
不,你不能创建一个正则表达式,将解析任何URI(或URL或URN) - 在唯一方法来解析他们正确地阅读它们的规范RFC-3986
不要使用正则表达式。如果你不能抗拒,可以在这里找到一个有效的: What is the best regular expression to check if a string is a valid URL? 但这个正则表达式是荒谬的。尝试使用你的框架,如果你可以的话(例如Uri在.net中的类)。
不,实际上它根本不匹配URL。它试图检测用文本编写的主机名,如www.example.com
。
其做法是尝试检测一些常见的已知的顶级域名,但:
[com|net|org|info\.]+
实际上是一个字符组,允许从列表|.comnetrgif
任何字符序列。大概这是意味着:
((com|net|org|info)\.)+
也[www]
同样是错误的,加上dot
企业没有真正使任何意义。
但这通常是一个非常糟糕的主意。有方式更常用的顶级域名,而不仅仅是那些和两个字母的CCTLD。还有很多/大多数CCTLD没有com/net/org/info的二级域名。这个表达式将无法匹配这些表达式,并且会匹配一些其他不应该成为主机名的东西。
事实上,检测主机名的任务基本上是不可能的,因为单个单词可以是主机名,任何点分隔的单词序列都可以。 (并且自引入国际化域名以来,几乎任何东西都可以成为主机名,例如例え.テスト
。)
'any'url是一个强硬的调用。在OZ你有.com.au,在英国它是.co.uk每个国家都有自己的规则,他们可以改变。 .xxx刚刚获得批准。非ASCII字符现在已被批准,但我怀疑你不需要这些字符。
我想知道你为什么要验证那是紧的?许多正确的网址将被排除,并且不排除所有不正确的网址。 www.thisisnotavalidurl.com仍然会被接受。 A)使用松散检查,仅用于([a-zA-Z0-9 _.-]。)* [a-zA-Z0-9 _.-](或somthing),就像一个完整性检查 B)使用反向查找来检查URL是否真的有效,如果你只想允许实际的真实URL。
哦,我发现这个:http://www.fileformat.info/tool/regex.htm是一个非常有用的工具,如果我正在开发正则表达式,我不擅长。
'[www]'不是你想象的那样。阅读[字符类](http://www.regular-expressions.info/charclass.html) – Amarghosh 2010-07-08 10:43:18
你自己写了吗?你的意思是什么网址? – Gumbo 2010-07-08 10:43:41
'博物馆'是一个有效的顶级域名,如'com','net'等 – Amarghosh 2010-07-08 10:44:35