在PHP中,如何验证给定的字符串是真正的URL?

时间:2009-08-19 20:41:18

标签: php url curl

我需要找到最佳方式(就性能而言),以查找给定字符串是否为网址。
REGEXP无济于事,因为www.eeeeeeeeeeeeeeee.bbbbbbbbbbbbbbbbb.com是一个有效的网址名称,但不属于人类已知的任何网络。
我正在考虑使用CURL并查看我是否返回状态200或只是file_get_contents并分析结果 还有更好的方法吗?

5 个答案:

答案 0 :(得分:7)

不要取整个内容 - 这可能是巨大的。发出HEAD请求。

当然,您可以先进行一些验证 - 删除无效的URL,而不仅仅是当前没有任何内容提供的网址。之后,发出HEAD请求就好了。话虽如此,它变成了灰色区域......返回“需要授权”的URL怎么样?它可能是受密码保护的目录,但如果您知道密码,则然后返回404,因为文件本身不存在...

答案 1 :(得分:4)

This文章概述了如何从php执行DNS请求。这可能是最快的选择,虽然它不会告诉你任何事情,如果服务器在线,找到文件等等。但它会告诉你,网址已注册到IP。这取决于您是否符合“有效”的定义

答案 2 :(得分:1)

您不是指网址,而是指域名

答案 3 :(得分:0)

$host != gethostbyname($host)

用于检查主机。

答案 4 :(得分:0)

我强烈建议使用CURL,但只使用标题而不提取任何内容。

这是函数,我用它来验证给定的URL是否有效并找到。

function __checkUrl($url)
{
    //First checking with pattern whether it is proper or not
    $pattern = '/^(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?$/';
    if (preg_match($pattern, $url))
    {
        $ch = curl_init();

        // set URL and other appropriate options
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_MAXREDIRS, 3);
        curl_setopt($ch, CURLOPT_NOBODY, true);
        curl_setopt($ch, CURLOPT_AUTOREFERER, true);
        curl_setopt($ch, CURLOPT_FORBID_REUSE, true);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 4);
        curl_setopt($ch, CURLOPT_TIMEOUT, 4);

        // grab URL
        $output = curl_exec($ch);
        // Get response code
        $response_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $newurl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

        // Not found?
        if ($response_code == '404') {
            return false;
        } else {
            return $newurl;
        }
    }
    else
    {
        return false;
    }
}

使用此功能,我首先检查URL实际上是否与Regex有效。那卷曲之后。通过将CURLOPT_FOLLOWLOCATION设置为true,我们正在处理301和类似的重定向,但限制否。重定向到3。 最后,我们在所有重定向后返回有效URL。

希望这有帮助。