有没有办法改善网站URL的正则表达式?

时间:2011-11-28 03:43:44

标签: php regex

^(https?:\/\/([a-zA-Z0-9\-]{1,64}\.){0,127}([a-zA-Z0-9\-]{3,64})\.\w{2,4}(\/.*)?)?$

我只需要匹配网站网址(没有IP,端口,用户名/密码等)。这个正则表达式中是否存在任何严重缺陷?

编辑:这是一个略有改进的地方:

^(https?:\/\/([a-zA-Z0-9\-]{1,64}\.){0,127}([a-zA-Z0-9\-]{1,64})\.\w{2,7}(\/.*)?)?$

我意识到域名无法以破折号开头或结尾。有没有一种简单的方法可以匹配以破折号开头或结尾的域名?

1 个答案:

答案 0 :(得分:0)

在第一部分中,你是非常严格的,只允许使用[a-zA-Z0-9\-]字符,在最后一部分中你允许任何内容,但换行符。

==>在第一部分中,您缺少许多有效字符,在最后一部分中,您将匹配任何内容直到字符串结尾。

为什么不简化这个并匹配以http开头并且到最后没有空格的任何内容?

^https?:\/\/\S+$

要避免域名中的开始/结束短划线,请在第二个表达式中使用外观。我还将.*替换为\S*

^(https?:\/\/([a-zA-Z0-9\-]{1,64}\.){0,127}((?!-)[a-zA-Z0-9\-]{1,64})(?<!-)\.\w{2,7}(\/\S*)?)?$

here online on Regexr

为什么要使用周围的()?制作完整的表达式。所以它也会匹配一个空字符串。