编写适用于URL的正则表达式时遇到问题

时间:2016-12-10 09:44:20

标签: php html regex

我无法编写有效的正则表达式来验证以下内容:

www.example.com
www.example.com/
example.com
http://www.example.com
https://example.com
111.111.111.111
1.1.1.1
1.1.1.123
http://1.1.1.1
http://1.1.1.1/
example.com
example.com/
http://www.example.com/

我目前只有这个正则表达式:

^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$|https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)|(www\.)[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)|^(?:[-A-Za-z0-9]+\.)+[A-Za-z]{2,6}$|(?:http:\/\/|www\.|https:\/\/[\/])([^\/]+)|^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$[\/]

&安培;只会验证这一点:Screenshot of Validated Domains

我的问题是,任何人都可以帮助我获得一个正常运行的正则表达式,允许所有这些示例域以html模式被允许吗?谢谢!

2 个答案:

答案 0 :(得分:2)

这种简化方法怎么样:

^(https?://)?[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/?$|^(https?://)?([a-z0-9-][a-z0-9-]+\.)+[a-z][a-z]+/?

看看试验台:https://regex101.com/r/3VpAxI/1

然而,正则表达式匹配网址存在一些常见问题:

  • 您列出的某些字符串(并且已被接受)不是有效的网址。
  • 非常很难挑剔是否指定了有效的TLD。
  • 无法测试某些TLD定义的特定要求。
  • 给定的模式接受IDN网址。
  • 目前只接受http(s)个网址,没有其他协议。
  • 目前接受IPV6地址。

肯定可能是某些字符串被想要接受,但实际上你的排除定义非常含糊......

答案 1 :(得分:0)

您也可以试试这个。我没有使用您的网址验证正则表达式模式。但它的确有效。有关您在问题中提供的有效网址列表。但是在正则表达式下面使用上面列出的网址或者像这样,如果你改变模式它不会。在这里,

((http|https)\:\/\/)?(([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3})\/?)|((http|https)\:\/\/)?(([a-z0-9-]+\.)([a-z0-9-]+\.)?([a-z]+)\/?)

我在这里测试过它。 https://regex101.com/r/P1ba2V/2

希望它对你有所帮助。