vdb / uri
一套基于RFC 3986的URI类和URI解析器
Requires
- php: >=7.4||^8.0
Requires (Dev)
- phpunit/phpunit: ^9.0.0
This package is auto-updated.
Last update: 2024-09-23 23:12:58 UTC
README
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 这里。