7

嗨,我想验证以下网址,因此只要存在 .com、.net、.org 等顶级域名,它们都会通过或不带 http/www 部分。

有效的 URL 应该是:

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

要支持长 tld:

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

(但这是额外的!)

也允许破折号(-),忘了说=)

我发现许多功能可以验证一个或另一个,但不能同时验证两者。如果有人知道好的正则表达式,请分享。谢谢您的帮助。

4

4 回答 4

6

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

以上答案是正确的,但不适用于 .me、.it、.in 等所有域

所以请在下面的用户进行 url 匹配:

$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";
}
于 2015-02-26T05:28:25.690 回答
1

当您忽略路径部分并仅查找域部分时,一个简单的规则是

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

如果您还想支持国家 TLD,则必须提供完整的(当前)列表或附加|..到 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+)/';
于 2012-12-18T06:09:10.203 回答
1

我认为您可以将标志用于filter_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)
于 2016-09-13T09:35:33.733 回答
0

不要使用正则表达式。并非所有涉及字符串的问题都需要使用正则表达式。

不要编写自己的 URL 验证器。URL 验证是一个已解决的问题,现有的代码已经编写、调试和测试。事实上,它是 PHP 的标准配置。

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

于 2012-12-18T14:43:19.860 回答