2012-12-18 57 views
4

嗨我想验证这个下面的网址,所以他们都会通过或不通过http/www部分在他们只要有像.com,.net,.org等TLD呈现..验证URL有或没有协议

有效网址应为:

http://www.domain.com 
http://domain.com 
https://www.domain.com 
https://domain.com 
www.domain.com 
domain.com 

支持长顶级域名:

http://www.domain.com.uk 
http://domain.com.uk 
https://www.domain.com.uk 
https://domain.com.uk 
www.domain.com.uk 
domain.com.uk 

为了支持破折号( - ):

http://www.domain-here.com 
http://domain-here.com 
https://www.domain-here.com 
https://domain-here.com 
www.domain-here.com 
domain-here.com 

还支持号码域:

http://www.domain1-test-here.com 
http://domain1-test-here.com 
https://www.domain1-test-here.com 
https://domain1-test-here.com 
www.domain1-test-here.com 
domain-here.com 

而且也许甚至允许IP地址:

127.127.127.127 

(!但是这是多余的)

也让破折号( - ),忘了mantion =)

我发现许多函数验证一个或另一个,但n两者都在同一时间。 如果有人知道它的好正则表达式,请分享。感谢您的帮助。

+0

@Amadan,以及正则表达式的一部分:)不知道如何写一个来处理所有这些域。 – Tux

+0

['FILTER_VALIDATE_URL'](http://php.net/filter.filters.validate)? – Charles

+0

@Charles,这只允许http://和www,如果你不输入这些,它不会通过。 – Tux

回答

1

当你忽略的路径部分并查找域部分而已,一个简单的规则是

(?:https?://)?(?:[a-zA-Z0-9.-]+?\.(?:com|net|org|gov|edu|mil)|\d+\.\d+\.\d+\.\d+) 

如果你想支持的国家顶级域名,以及您必须提供完整的(当前)列表或向TLD部分附加|..

随着preg_match,必须用它的一些分隔符

$pattern = ';(?:https?://)?(?:[a-zA-Z0-9.-]+?\.(?:com|net|org|gov|edu|mil)|\d+\.\d+\.\d+\.\d+);'; 
$index = preg_match($pattern, $url); 

通常情况下,你使用/之间。但在这种情况下,斜杠是模式的一部分,所以我选择了其他分隔符。否则,我必须逃脱斜线与\

$pattern = '/(?:https?:\/\/)?(?:[a-zA-Z0-9.-]+?\.(?:com|net|org|gov|edu|mil)|\d+\.\d+\.\d+\.\d+)/'; 
+0

我试着用preg_match这个规则并且抛出一些错误。我错过了什么吗?我做了preg_match($ pattern,$ url)和引号内的正则表达式。 – Tux

+0

@Tux请参阅修改后的答案。 –

0

不要使用正则表达式。不是每个涉及字符串的问题都需要使用正则表达式。

不要编写自己的URL验证器。 URL验证是一个已解决的问题,并且存在已经编写,调试和测试的现有代码。实际上,它标配了PHP。

看看PHP的内置过滤功能:http://us2.php.net/manual/en/book.filter.php

+1

不完全正确。 URL验证器(filter_var)在PHP中失败了,但我们没有很好解决这个问题。 OP的规则说“只要TLD存在”,所以正则表达式是可接受的解决方案。 – kodeart

4

对于URL验证完美的解决方案。

上面的回答是正确的,但像.ME,。它的所有域不行,。在

所以请在下方为用户匹配网址:

$pattern = '/(?:https?:\/\/)?(?:[a-zA-Z0-9.-]+?\.(?:[a-zA-Z])|\d+\.\d+\.\d+\.\d+)/'; 

if(preg_match($pattern, "http://website.in")) 
{ 
echo "valid"; 
}else{ 
echo "invalid"; 
} 
1

我认为你可以使用flagsfilter_vars

FILTER_VALIDATE_URL有几个标志可用:

  • FILTER_FLAG_SCHEME_REQUIRED要求URL包含一个方案 一部分。
  • FILTER_FLAG_HOST_REQUIRED需要该URL包含主机 部分。
  • FILTER_FLAG_PATH_REQUIRED需要URL包含路径 部分。
  • FILTER_FLAG_QUERY_REQUIRED需要URL包含查询 字符串。

FILTER_FLAG_SCHEME_REQUIREDFILTER_FLAG_HOST_REQUIRED默认情况下使用。

比方说,你要检查的路径一部分,不想检查计划的一部分,你可以做这样的事情(falg是位掩码):

filter_var($url, FILTER_VALIDATE_URL, ~FILTER_FLAG_SCHEME_REQUIRED | FILTER_FLAG_PATH_REQUIRED)