2012-01-12 27 views
0

IHAVE一个PHP的preg_match正则表达式是:PHP的preg_match,不工作的验证URL的

#^(http:\/\/|https:\/\/|www\.|//)*(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d{1,5}))?([A-Z0-9_-]|\.|\/|\?|\#|=|&|%)*$#i 

问题是,当我尝试匹配的任何URL以.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,但它应该返回false,因为.com & &不是有效的TLD。

回答

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

+0

filter_var不会验证.me域!那是错误! – Ahsan 2012-01-12 09:02:24

+0

@Ahsan:当然,它的确如此:http://codepad.viper-7.com/XBbh3d – hakre 2012-01-12 09:32:09