用于验证 URL 的 PHP 正则表达式

标签 php regex validation url backwards-compatibility

我正在寻找一个合适的正则表达式来匹配一个 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/

相关文章:

php - 解谜: Finding All Words Within a Larger Word in PHP

PHP 事务提交正常但 MySQL 数据库未更改

javascript - 如何链接 JS 路由变量和 Symfony 2 URL

带箭头的 PHP 正则表达式 (>>)

php - Laravel - php artisan 制作 :model Project Doesnt Work

php - 在php中使用正则表达式多次查找字符之间的字符串值

regex - 如何验证 SSL 证书

validation - Grails 验证 : get message from error object as string

php - Joomla 3自定义服务器端表单验证规则

validation - 如何在 Go 中处理控制台输入类型验证?