vdb/uri

一套基于RFC 3986的URI类和URI解析器

维护者

详细信息

github.com/mvdbos/vdb-uri

源代码

问题

安装次数: 194,919

依赖者: 1

建议者: 0

安全性: 0

星标: 11

关注者: 4

分支: 4

开放问题: 1

类型:application

v0.3.3 2023-08-09 20:30 UTC

README

Build Status Latest Stable Version Total Downloads License

README

什么是VDB\URI?

一套基于RFC 3986的URI类和URI解析器,受到java.net.URI的启发。

使用它,开发者可以解析、验证、标准化和比较URI。一旦解析了URI,开发者可以使用URI对象来获取关于URI的详细信息。

解析器是一个验证解析器,可以处理URL、URN以及任何URI方案,如http、mailto、ftp等。

通过扩展Uri或如果你有冒险精神,实现URI接口,你可以轻松地为特定的URI方案创建自己的URI类。

安装

安装VDB\URI最简单的方法是下载vdb-uri.phar。然后你只需包含Phar文件以开始使用VDB\URI:require_once '/path/to/vdb-uri.phar';

使用composer安装VDB\URI是一种更灵活的方式。这样,你可以控制使用哪个版本。在https://packagist.org.cn下以名称vdb/uri查找。

用法

示例

第一步是创建一个URI对象。在这个例子中,我们将使用通用的Uri类。

use VDB\Uri\Uri;

$uri = new Uri('http://user:pass@example.com/foo/..?bar#baz');

或者,你可以使用一个带有基础URI的相对引用来解析它

$uri = new Uri('/foo/..?bar#baz', 'http://user:pass@example.com?ignored');

或者,如果不知道基础URI,只需提供相对引用

$relativeUri = new Uri('/foo/..?bar#baz');

然后我们可以获取验证后、重新组合的URI字符串

$parsedUriString = $uri->toString(); // 'http://user:pass@example.com/?bar#baz'
$parsedRelativeUriString = $relativeUri->toString(); // '/foo/..?bar#baz'

或者使用访问器访问其单独的组件

$query = $uri->getQuery(); // 'bar'

作为调用toString()的替代,你可以在字符串上下文中简单地使用URI,因为__toString()被实现为toString()的别名。

注意,规范化不会自动发生,你必须调用normalize()。规范化包括以下内容

  • 路径组件中的点段
  • 如果它与方案默认端口匹配,则端口
  • 百分编码和根据RFC 3986的相关字符大小写。唯一的例外是:当使用基础URI构建带有基础URI的相对引用时,路径中的点段在解析相对引用时自动规范化为绝对基础URI的一部分。

API

基础知识

  • __construct($reference, $baseUri = null)
  • __toString()
  • toString()

规范化

  • normalize()

比较

  • `equals(URI $uri, $normalized)

访问器

  • getFragment()
  • getHost()
  • getPassword()
  • getPath()
  • getPort()
  • getQuery()
  • getScheme()
  • getUsername()

为特定方案子类化Uri

尽管Uri类可以解析任何URI,但不同的URI方案(http、https等)对于有效URI的定义规则不同。例如:HTTP方案规范指出,URL的路径组件如果为空,则应设置为'/'。实现此自定义行为的最佳方式是通过子类化Uri。

你可以在子类中重写一些方法

方案特定的后处理

  • doSchemeSpecificPostProcessing()。在这里,您可以对解析后的组件值进行任何操作

验证器。如果组件值无效,应抛出VDB\URI\UriSyntaxException

  • validateAuthority()
  • validateFragment()
  • validateHost()
  • validateOriginalUrlString()
  • validatePassword()
  • validatePath()
  • validatePort()
  • validateQuery()
  • validateScheme()
  • validateUserInfo()
  • validateUsername()

请查看Http类以获取示例实现。

使用技巧

如果您想在应用程序中使用VDB\Uri类的类型提示(您应该这么做),应使用UriInterface而不是Uri类。这样,您的应用程序将支持在不进行任何重构的情况下切换不同的URI类实现。

待办事项

要查看待办事项列表,请查看里程碑功能完整的issues 这里