php preg_match,不用于验证URL

时间:2012-01-12 08:48:44

标签: php windows apache preg-match

我有一个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&&不是有效的顶级域名。

1 个答案:

答案 0 :(得分:3)

最后你的位置......

([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