我正在寻找一个合适的正则表达式来匹配一个 URL(一个带有方案、域、路径等的完整 URL) 我通常会使用 filter_var 但在这种情况下我不能,因为我必须支持 PHP<5.2!
我在网上搜索过,但找不到任何我确信会万无一失的东西,而我在 SO 上所能找到的只是人们说要使用 filter_var。
有人有用于此的正则表达式吗?
我的代码(只是为了让您看到我想要实现的目标):
function validate_url($url){
if (function_exists('filter_var')){
return filter_var($url, FILTER_VALIDATE_URL);
}
return preg_match(REGEX_HERE, $url);
}
最佳答案
我已经创建了一个验证域的解决方案。虽然它没有具体涵盖整个 URL,但它非常详细和具体。您需要问自己的问题是,“我为什么要验证域?”如果是查看域是否实际存在,则需要确认域(包括有效的 TLD)。问题是,太多的开发人员采用 ([a-z]{2,4}) 的捷径并称其为好。如果您按照这些思路思考,那么为什么称它为 URL 验证呢?不是。它只是通过正则表达式传递 URL。
我有一个开放源代码类,它不仅可以让您使用 TLD 管理的单一来源 (iana.org) 验证域,还可以通过 DNS 记录验证域以确保它确实存在。 DNS 验证是可选的,但域将根据 TLD 特别有效。
例如:example.ay 不是有效域,因为 .ay TLD 无效。但是使用此处发布的正则表达式 ([a-z]{2,4}),它会通过。我对质量有亲和性。我尝试在我编写的代码中表达这一点。其他人可能并不真正关心。因此,如果您只想“检查”URL,则可以使用这些响应中列出的示例。如果您真的想验证 URL 中的域,您可以在我创建的类中执行此操作。它可以在以下位置下载: http://code.google.com/p/blogchuck/source/browse/trunk/domains.php
它根据 RFC 进行验证,这些 RFC“管理”(宽松地使用术语)确定有效域的内容。简而言之,域类将执行以下操作: 域验证的基本规则
- 必须至少有一个字符长
- 必须以字母或数字开头
- 包含字母、数字和连字符
- 必须以字母或数字结尾
- 可能包含多个节点(即 node1.node2.node3)
- 每个节点最多只能有 63 个字符
- 总域名最多只能有 255 个字符
- 必须以有效的 TLD 结尾
- 可以是IP4地址
只有在检查您的本地副本后,它才会下载主 TLD 文件 iana.org 的副本。如果您的本地副本已过期 30 天,它将下载一个新副本。文件中的 TLD 将在 REGEX 中使用,以验证您正在验证的域中的 TLD。这会阻止 .ay(和其他无效的 TLD)通过验证。
这是一段冗长的代码,但考虑到它的作用,它非常紧凑。而且是最准确的。这就是我之前问这个问题的原因。你想做“验证”还是简单的“检查”?
关于用于验证 URL 的 PHP 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2390275/