我真的不想使用卷曲或任何复杂的东西。 我正在寻找一种简单的方法来检查url(用户是否输入url然后存储在我的MySQL数据库中)是否有效并且它是一个有效的URL,即域存在。 fopen是一个很好的解决方案吗?
非常感谢任何关于此的教程或提示。
答案 0 :(得分:5)
CURL并不复杂。获取网址的http状态:
$ch = curl_init('http://www.yahoo.com/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if($status >= 200 && $status < 400) {
// url is valid
}
正则表达式或过滤器将验证url是否有效但不存在。 DNS查找验证域是否存在,但不验证URL。
答案 1 :(得分:2)
首先,使用filter_var()
验证它是有效的网址:
<?php
$url = "http://www.example.com/foo.php";
if(!filter_var($url, FILTER_VALIDATE_URL))
{
die('Invalid URL');
}
接下来,使用parse_url()
解析URL并确保它是HTTP(S):
$p_url = parse_url($url);
if(!$p_url) // couldn't parse URL, since parse_url() cannot recognize it
{
die('Invalid URL');
}
if($p_url['scheme'] != 'http' && $p_url['scheme'] != 'https')
{
die('Invalid protocol (only HTTP(S) is supported)');
}
最后,检查主机是否存在以及您是否可以连接到主机。我选择在这里使用fsockopen()
,因为它会检查主机名和端口,而不是实际发送HTTP请求。
$fp = fsockopen($p_url['host'], (isset($p_url['port']) ? $p_url['port'] : 80));
if($fp)
{
echo 'Valid URL';
fclose($fp); // Remember to close the file pointer
}else{
echo 'Invalid server';
}
请注意,您可能希望避免使用此方法(取决于您希望应用程序执行的操作),就好像服务器已关闭一样,这将导致Invalid server
,即使服务器可能存在。另一种解决方案是仅使用gethostbyaddr()
和gethostbyname()
来检查DNS服务器中的主机名,而不是根本连接:
if(@gethostbyaddr($p_url['host'])) // IP addresses passes this test
{
echo 'Valid URL';
}else{
$host = $p_url['host'];
$addr = gethostbyname($host);
if(!$addr) // Invalid domain name
{
echo 'Invalid domain name';
}else if($host == $addr) // Domain name could not be resolved (i.e. does not exist)
{
echo 'Invalid domain name';
}else{
echo 'Valid URL';
}
}
链接:
filter_var()
- 验证字符串parse_url()
- 将网址解析为数组fsockopen()
- 打开套接字连接gethostbyaddr()
- 获取IP地址的域名(不确定它是否支持IPv6)gethostbyname()
- 获取域名的IPv4地址答案 2 :(得分:0)
你应该尝试filter_var
<?php
$url = "http://www.example.com";
if(!filter_var($url, FILTER_VALIDATE_URL))
{
echo "URL is not valid";
}
else
{
echo "URL is valid";
}
?>