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