我想知道在php中检查提供的url是否有效的最佳方法是什么...起初我尝试过:
filter_var($url, FILTER_VALIDATE_URL) === false
但它不接受www.example.com
(没有协议)。所以我尝试了一个简单的修改:
protected function checkReferrerUrl($url) {
if(strpos($url, '://') == false) {
$url = "http://".$url;
}
if(filter_var($url, FILTER_VALIDATE_URL) === false) {
return false;
}
return true;
}
现在它适用于www.example.com
,但在转换为foo
时也会接受简单的http://foo
。但是,虽然这不是一个有效的公共网址,但我认为...所以你会建议什么?回到传统 regexp?
答案 0 :(得分:3)
我建议您不要将filter_var与类型URL一起使用。 还有更多的副作用。 例如,根据filter_var:
,这些是有效的URLhttp://example.com/"><script>alert(document.cookie)</script>
http://example.ee/sdsf"f
此外,FILTER_VALIDATE_URL不支持国际化域名(IDN)。
出于安全原因,我建议在之后使用正则表达式结合一些ifs(域名为f.e.)。 没有安全方面,我使用parse_url来获取我的部分。但是当缺少方案(没有http / https)时,此功能也有类似的问题。
答案 1 :(得分:0)
使用此
<?php
$url = 'www.example.com';
if(validateURL($url)){
echo "Valid";
}else{
echo "invalid";
}
function validateURL($URL) {
$pattern_1 = "/^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i";
$pattern_2 = "/^(www)((\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i";
if(preg_match($pattern_1, $URL) || preg_match($pattern_2, $URL)){
return true;
} else{
return false;
}
}
?>
尝试这个
<?php
// Assign URL to $URL variable
$url = 'http://example.com';
// Check url using preg_match
if (preg_match("/^(https?:\/\/+[\w\-]+\.[\w\-]+)/i",$url)){
echo "Valid";
}else{
echo "invalid";
}
?>