这个正则表达式适用于任何网址吗?
preg_match_all(
'/([www]+(\.|dot))?[a-zA-Z0-9_\.-]+(\.|dot){1,}[com|net|org|info\.]+((\.|dot){0,}[a-zA-Z]){0,}+/i',
$url, $regp);
答案 0 :(得分:2)
不要使用正则表达式。如果你无法抗拒,可以在这里找到一个有效的: What is the best regular expression to check if a string is a valid URL? 但那个正则表达式很荒谬。如果可以的话,尝试使用你的框架(例如.net中的Uri类)。
答案 1 :(得分:1)
没有。实际上它根本不匹配URL。它正在尝试检测用文本编写的主机名,例如www.example.com
。
它的方法是尝试检测一些常见的已知TLD,但是:
[com|net|org|info\.]+
实际上是一个字符组,允许列表|.comnetrgif
中的任何字符序列。可能这意味着:
((com|net|org|info)\.)+
以及[www]
同样是错误的,加上dot
的商家并没有任何意义。
但这通常是一个非常糟糕的主意。除了那些和2个字母的CCTLD之外,还有 way 更常用的TLD。此外,许多/大多数CCTLD没有com / net / org / info的二级域名。这个表达式将无法与那些表达式匹配,并且会匹配一堆其他不应该是主机名的东西。
事实上,检测主机名的任务基本上是不可能的,因为单个单词可以是主机名,任何以点分隔的单词序列也是如此。 (自从引入国际化域名以来,几乎任何东西都可以是主机名,例如。例え.テスト
。)
答案 2 :(得分:1)
'任何'网址是一个艰难的电话。在OZ你有.com.au,在英国是.co.uk每个国家都有自己的一套规则,他们可以改变。 .xxx刚刚获得批准。现在已经批准了非ascii字符,但我怀疑你不需要它。
我想知道你为什么要验证那么紧?许多正确的网址将被排除在外,并且不会排除所有不正确的网址。 www.thisisnotavalidurl.com仍然会被接受。
我会建议 A)使用更宽松的检查,仅用于([a-zA-Z0-9 _.-]。)* [a-zA-Z0-9 _.-](或somthing),就像一个完整性检查 B)如果您只想允许实际的真实网址,则使用反向查找来检查URL是否实际有效。
哦,我发现这个:http://www.fileformat.info/tool/regex.htm是一个非常有用的工具,如果我正在开发正则表达式,我不擅长。
答案 3 :(得分:0)
[www]+
应更改(www)?
(\.|dot){1,}
- 一个还是多个?你可能想做([a-zA-Z0-9_\.-]+(\.|dot)){1,}
答案 4 :(得分:0)
答案 5 :(得分:0)
不,并且您无法创建将解析任何URI(或URL或URN)的REGEX - 正确解析它们的 方法是按照RFC规范读取它们3986