我有一个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&,它返回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,但应该以.com&;不是有效的TLD。
您的位置在末尾。。。
([A-Z0-9_-]|'.|'/|'?|'#|=|&|%)*
是和符相匹配的。如果有一个查询字符串,您可能想做的是需要一个带前缀的问号:
('?([A-Z0-9_-]|'.|'/|'?|'#|=|&|%)*)?
然而,在PHP 5.2+中有一种更好的方法:
var_dump(filter_var('http://example.com', FILTER_VALIDATE_URL));
http://www.php.net/manual/en/filter.filters.validate.php