我有一个PHP preg_match正则表达式:
#^(http:\/\/|https:\/\/|www\.|//)*(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d{1,5}))?([A-Z0-9_-]|\.|\/|\?|\#|=|&|%)*$#i
问题是当我尝试匹配任何以.com&&amp ;;结尾的网址时,它返回true,但正如预期的那样它应该返回false,它可能会出错?
我用它作为:
function isValidURL($url) {
if (preg_match("#^(http:\/\/|https:\/\/|www\.|//)*(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d{1,5}))?([A-Z0-9_-]|\.|\/|\?|\#|=|&|%)*$#i", $url)) {
return true;
}else{
return false;
}
}
并将其作为:
访问$URL = $_GET['url'];
echo var_dump(isValidURL($URL));
现在,如果我以/url.php?url=http://www.google.com
打开页面,则返回true,如果我打开页面为/url.php?url=http://www.google.com**
,则返回false。如果我以/url.php?url=http://www.google.com&&
打开页面,它会返回true,但它应该返回false,因为.com&&不是有效的顶级域名。
答案 0 :(得分:3)
最后你的位置......
([A-Z0-9_-]|\.|\/|\?|\#|=|&|%)*
与&符号匹配的是什么。如果有查询字符串,您可能想要做的是需要带前缀的问号:
(\?([A-Z0-9_-]|\.|\/|\?|\#|=|&|%)*)?
但是,在PHP 5.2 +中有更好的方法:
var_dump(filter_var('http://example.com', FILTER_VALIDATE_URL));