【问题标题】:PHP Regex that matches regular, valid URLs only仅匹配常规有效 URL 的 PHP 正则表达式
【发布时间】:2017-03-03 17:33:51
【问题描述】:

我正在寻找仅匹配有效在线 URL 的正则表达式。

例如:

exmaple.com
http://exmaple.com
https://exmaple.com
www.exmaple.com
http://www.example.com
https://www.example.com

以及特殊的域和扩展,例如:

t.co
example.deals
sh.party

等等,但不会匹配所有复杂的东西,比如ftpget 查询或像2.3.3.1 这样的 URL。

我一直在使用'#(www\.|https?://)?[a-z0-9]+\.[a-z0-9]{2,4}\S*#i',但它会检测到日期,例如3.3.2017

我需要这个,因为我将get_headers 应用于每个找到的 URL,当我对日期等无效 URL 执行 get_headers 时,我得到:

get_headers(http://03.03.2017): failed to open stream: Connection timed out

TL;DR:我正在寻找一个匹配您可以应用get_headers() 的 URL 的正则表达式。

感谢您的帮助!

【问题讨论】:

  • 有没有包含数字的顶级域名?顺便说一句,“交易”有五个字符。
  • @JosefScript 看起来像12345.com 这样的域没有问题,尽管我很确定没有任何唯一的数字扩展。
  • 一个正则表达式不能告诉online URL,它只能匹配一个模式。匹配域的模式也将很难,chris.inc 是公司名称还是域?
  • @Aviel Shomron:顶层是“com”部分。有没有像“company.123”这样的东西?

标签: php regex url


【解决方案1】:

我会说正则表达式不是检查有效 URL 的最佳解决方案。最好使用FILTER_VALIDATE_URL

<?php
 $url = "https://www.w3schools.com";

 if (!filter_var($url, FILTER_VALIDATE_URL) === false) {
   echo("$url is a valid URL");
 } else {
   echo("$url is not a valid URL");
 }
 ?>

【讨论】:

  • 如果是 IP 地址,您可以使用 FILTER_VALIDATE_IP 进行验证。使用两者都可以解决您的问题。
  • 不完全是,23.2017 不是 IP,因为 2017 大于 255。在我的代码中,我只需要检测 url,因为当您向 get_headers() 提供任何其他内容时,连接超时并且它落后于网站。
  • 我看你好像害怕get_headers 会超时。您将无法避免此问题 -> 如果您有 somethingthatdoesnotexist.com,您的预期代码会认为它没问题,并且您会仍然超时。因此,您正在跳槽以避免23.2017 的“特殊”情况返回false,但是对于这些示例中的每一个,都有很多示例您发现“有效”但也不存在。我会说:只需使用filter_validate_url,尝试删除任意“更糟糕”的网址是不值得的
【解决方案2】:
#(https?:\/\/)?([a-z0-9_~-]+\.)+[a-z]{2,5}(\/\S*)?#i

编辑:第三次尝试:开始时可选 http 或 https。之后至少跟随一个域名和一个点,然后是一个由 2-5 个字母组成的顶级域和一个可选的反斜杠尾部和其他非空格字符。

【讨论】:

  • 看起来不错,但问题是这个正则表达式接受像 example.com:) 这样的 URL,这对 get_headers 来说是个问题,因为这个 URL 无效。
  • 我正在寻找类似于 LinkifyJS 所做的事情,但在 PHP 中。我无法从源代码中找到它的正则表达式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多