REGEX URL正则表达式

时间:2010-07-08 10:39:25

标签: php regex

  

可能重复:
  Regular expression for browser Url

这个正则表达式适用于任何网址吗?

preg_match_all(
 '/([www]+(\.|dot))?[a-zA-Z0-9_\.-]+(\.|dot){1,}[com|net|org|info\.]+((\.|dot){0,}[a-zA-Z]){0,}+/i', 
 $url, $regp);

6 个答案:

答案 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)

{p> [www]+应更改(www)?

(\.|dot){1,} - 一个还是多个?你可能想做([a-zA-Z0-9_\.-]+(\.|dot)){1,}

答案 4 :(得分:0)

URL还有像http这样的协议,你就错过了。如前所述,您还缺少许多TLD。

像逃逸空间(%20)之类的东西也无法识别。

端口号也可以显示在网址中(例如:80)

答案 5 :(得分:0)

不,并且您无法创建将解析任何URI(或URL或URN)的REGEX - 正确解析它们的 方法是按照RFC规范读取它们3986