[英]a quick question about url validation
我真的不想使用curl或類似的東西。 我在尋找一種簡單的方法來檢查url(用戶將輸入該url,然后將其存儲在我的MySQL數據庫中)是否有效,並且它是有效的url,即域存在。 fopen是一個好的解決方案嗎?
任何對此的教程或技巧將不勝感激。
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。
首先,使用filter_var()
確認它是有效的URL:
<?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
。 只能從DNS服務器檢查主機名而根本不連接的替代解決方案是使用gethostbyaddr()
和gethostbyname()
:
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()
-將URL解析為數組 fsockopen()
-打開套接字連接 gethostbyaddr()
-獲取IP地址的域名(不過不確定是否支持IPv6) gethostbyname()
-獲取域名的IPv4地址 您應該嘗試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";
}
?>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.