我的正则表达式验证URL是否正确?

时间:2011-07-17 15:42:27

标签: php regex

我正在研究在PHP中编写与Perl兼容的正则表达式,以检查给定字符串是否是有效的URL。

现在它正如预期的那样工作,但我想知道是否有任何预防措施我应该用它来检查它是否对用户输入是安全的。 $url变量按原样提交,如纯文本。

这是整个功能:

private function real_url($url) {
    return preg_match("/(http|https):\/\/(.*?)\.[a-zA-Z]{2,6}/i",$url);
}

我只想检查httphttps。我并不担心ftpirc等。只是网络链接。

它还会检查TLD的持续时间。 So "google.asdfasdfasdf"将返回false,但google.asdf"将返回true。我该如何解决这个问题? ".asdf"显然不是有效的TLD。

我只需要知道两件事:

  • 如何检查给定的URL是否真正合法;
  • 原始用户输入是否安全。

4 个答案:

答案 0 :(得分:5)

您应该使用filter_var代替:

private function real_url($url) {
    return filter_var($url, FILTER_VALIDATE_URL) !== FALSE;
}

注意,这不会验证该方案是否被允许(例如http / https),也不会验证顶级域是否存在。

验证域实际有效的最简单方法是进行DNS查找,例如使用checkdnsrr

private function validate_domain($domain) {
    return checkdnsrr($domain, "A");
}

答案 1 :(得分:1)

  

它还检查.something有多长。所以google.asdfasdfasdf会   返回false但google.asdf将返回true。我该怎么解决这个问题,   因为.asdf显然不是域名。

100%可靠地检查给定网址是否有效的方法是尝试并访问

任何其他方法(例如filter_var)只能检查语法的有效性,并且不会将DNS的更改考虑在内(例如新gTLD)。

查看PHP中的curl函数。理想情况下,您应首先组合filter_var(检查语法),并尝试访问URL以检查提供的URL是否确实存在。

答案 2 :(得分:0)

你的问题毫无意义。您是否知道目前hundreds of extensions are in process of validation并且无法跟上所有人的步伐。

这里有两个步骤:

  1. 确保URL是合法的,可以使用RegExp以非常肤浅的方式完成。您应该将RegExp与实际代码结合起来才能正确执行。
  2. 使用DNS查询测试域名以检查它是否存在(并不意味着它正常运行)
  3. 针对实际网址测试HEAD请求并查看其工作原理。 PHP中的大型列表非常困难。
  4. 请查看 Public Suffix计划。解析TLD列表。在脚本中实现它。并保持最新:)

答案 3 :(得分:-1)

唯一可以确定的方法是查询whois服务器(或Google site:domain.com)并检查域是否存在。 (.*?)几乎可以匹配所有内容,域名必须是[a-z0-9\-\_],但不能以hypen或下划线开头(你也需要正则表达式)。

@Alnitak

    function check($url){
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_NOBODY, 1);
        curl_setopt($curl, CURLOPT_HEADER, 1);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $data = curl_exec($curl);
        curl_close($curl);
        return $data;
    }

echo check("http://qwertgzhgfdsdfghjhzgtf.com");

将不返回任何内容,否则将返回标题。

echo (check('http://stackoverflow.com') != '')? ':)': ':(';