php preg_match,不适用于验证URL';s


php preg_match, not working for validating URL's

我有一个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,但应该以.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