stormcode / php-domain-parser
基于公共后缀列表的PHP URL解析实现。
Requires
- php: >=8.0
- ext-curl: *
- ext-intl: *
- ext-mbstring: *
Requires (Dev)
- mikey179/vfsstream: 1.2.*
- phpunit/phpunit: 4.*
This package is auto-updated.
Last update: 2024-09-16 18:35:14 UTC
README
PHP域名解析器 是一个基于 公共后缀列表 的域名解析器,采用PHP实现。
动机
尽管有大量的优秀URL解析器和构建器可用,但能够准确地将URL解析为子域名、可注册域和公共后缀部分的项目却很少。
考虑域名 www.pref.okinawa.jp。在这个域名中,公共后缀 部分是 okinawa.jp,可注册域 是 pref.okinawa.jp,子域名 是 www。你不能用正则表达式做到这一点。
其他类似的库主要关注URL构建、解析和操作,并且还包括公共后缀域名解析。PHP域名解析器从一开始就围绕基于公共后缀列表的准确解析构建,仅仅为了完整性添加了一个URL对象。
安装
目前(目前)支持的唯一安装方法是通过 Composer。
在项目的根目录中创建一个 composer.json
文件
{ "require": { "stormcode/php-domain-parser": "~1.0" } }
然后运行: composer install
将自动加载器添加到您的项目中
<?php require_once 'vendor/autoload.php'
现在您可以使用PHP域名解析器了。
用法
解析URL
将URL解析为其组成部分与下面的示例一样简单。
<?php require_once '../vendor/autoload.php'; $pslManager = new Pdp\PublicSuffixListManager(); $parser = new Pdp\Parser($pslManager->getList()); $host = 'http://user:pass@www.pref.okinawa.jp:8080/path/to/page.html?query=string#fragment'; $url = $parser->parseUrl($host); var_dump($url);
上面的代码将输出
class Pdp\Uri\Url#6 (8) {
private $scheme =>
string(4) "http"
private $host =>
class Pdp\Uri\Url\Host#5 (3) {
private $subdomain =>
string(3) "www"
private $registerableDomain =>
string(15) "pref.okinawa.jp"
private $publicSuffix =>
string(10) "okinawa.jp"
}
private $port =>
int(8080)
private $user =>
string(4) "user"
private $pass =>
string(4) "pass"
private $path =>
string(18) "/path/to/page.html"
private $query =>
string(12) "query=string"
private $fragment =>
string(8) "fragment"
}
便捷方法
提供了一个 __get() 方法来访问上述对象属性。获取解析域的公共后缀与下面的示例一样简单
<?php $host = 'waxaudio.com.au'; $url = $parser->parseUrl($host); $publicSuffix = $url->host->publicSuffix; // $publicSuffix = 'com.au'
IDNA支持
IDN(国际化域名) 支持在版本 1.4.0
中添加。支持Unicode域名及其ASCII等效项。
Unicode
解析IDNA主机与解析标准主机没有区别。在 解析URL 的示例中设置 $host = 'Яндекс.РФ';
(俄语西里尔文)将返回
class Pdp\Uri\Url#6 (8) {
private $scheme =>
string(4) "http"
private $host =>
class Pdp\Uri\Url\Host#5 (4) {
private $subdomain =>
NULL
private $registerableDomain =>
string(17) "яндекс.рф"
private $publicSuffix =>
string(4) "рф"
private $host =>
string(17) "яндекс.рф"
}
private $port =>
NULL
private $user =>
NULL
private $pass =>
NULL
private $path =>
NULL
private $query =>
NULL
private $fragment =>
NULL
}
ASCII(Punycode)
如果您选择提供Unicode域名名称的ASCII等效项(在 解析URL 的示例中为 $host = 'http://xn--d1acpjx3f.xn--p1ai';
),解析器将返回ASCII等效项
class Pdp\Uri\Url#6 (8) {
private $scheme =>
string(4) "http"
private $host =>
class Pdp\Uri\Url\Host#5 (4) {
private $subdomain =>
NULL
private $registerableDomain =>
string(22) "xn--d1acpjx3f.xn--p1ai"
private $publicSuffix =>
string(8) "xn--p1ai"
private $host =>
string(22) "xn--d1acpjx3f.xn--p1ai"
}
private $port =>
NULL
private $user =>
NULL
private $pass =>
NULL
private $path =>
NULL
private $query =>
NULL
private $fragment =>
NULL
}
IPv6支持
解析IPv6主机与解析标准主机没有区别。在 解析URL 的示例中设置 $host = 'http://[2001:db8:85a3:8d3:1319:8a2e:370:7348]:8080/'
将返回
class Pdp\Uri\Url#6 (8) {
private $scheme =>
string(4) "http"
private $host =>
class Pdp\Uri\Url\Host#5 (4) {
private $subdomain =>
NULL
private $registerableDomain =>
NULL
private $publicSuffix =>
NULL
private $host =>
string(38) "[2001:db8:85a3:8d3:1319:8a2e:370:7348]"
}
private $port =>
string(4) "8080"
private $user =>
NULL
private $pass =>
NULL
private $path =>
string(1) "/"
private $query =>
NULL
private $fragment =>
NULL
}
重要:IPv6 URL主机名必须用方括号括起来。如果不这样做,将无法正确解析。
感谢 @geekwright 在 bugfix pull request 中添加IPv6支持。
解析域名
如果您只想解析域名(或主机)部分,可以使用 Parser::parseHost()
。
<?php $host = $parser->parseHost('a.b.c.cy'); var_dump($host);
上面的代码将输出
class Pdp\Uri\Url\Host#7 (3) {
private $subdomain =>
string(1) "a"
private $registerableDomain =>
string(6) "b.c.cy"
private $publicSuffix =>
string(4) "c.cy"
}
仅检索域名组件
如果您只对域名组件感兴趣,可以使用解析器仅检索您感兴趣的组件
<?php var_dump($parser->getSubdomain('www.scottwills.co.uk')); var_dump($parser->getRegisterableDomain('www.scottwills.co.uk')); var_dump($parser->getPublicSuffix('www.scottwills.co.uk'));
上面的代码将输出
string(3) "www"
string(16) "scottwills.co.uk"
string(5) "co.uk"
健全性检查
您可以使用提供的 parse
vendor二进制文件快速从命令行解析URL。从项目的根目录,只需调用
$ ./vendor/bin/parse <url>
如果将 URL 传递给 parse
,该 URL 将被解析,并将输出打印到屏幕。
如果不传递 URL,将解析 http://user:pass@www.pref.okinawa.jp:8080/path/to/page.html?query=string#fragment
并将输出打印到屏幕。
示例
$ ./vendor/bin/parse http://www.waxaudio.com.au/ Array ( [scheme] => http [user] => [pass] => [host] => www.waxaudio.com.au [subdomain] => www [registerableDomain] => waxaudio.com.au [publicSuffix] => com.au [port] => [path] => / [query] => [fragment] => ) Host: http://www.waxaudio.com.au/
示例脚本
有关使用 PHP 域名解析器的更多信息,请参阅提供的 示例脚本。
刷新公共后缀列表
尽管在 data
目录中为您提供了缓存的公共后缀列表的 PHP 复制品,但该副本可能不是最新的(Mozilla 提供了 Atom 更改源以跟踪列表的更改)。请使用提供的供应商二进制文件来刷新公共后缀列表的缓存副本。
从项目的根目录,只需调用
$ ./vendor/bin/pdp-psl
您可以通过检查位于 data
目录中的文件的最后修改时间来验证更新。
重要:供应商二进制文件 pdp-psl
依赖于互联网连接来更新缓存的公共后缀列表。
贡献
欢迎拉取请求!在提交拉取请求之前,请审阅 CONTRIBUTING.md 文档。
归属
HTTP 适配器接口和 cURL HTTP 适配器受到了 Will Durand 的出色项目(或者说借鉴了)Geocoder 的启发。以下是他使用的 MIT 许可证和版权声明。
Copyright (c) 2011-2013 William Durand <william.durand1@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PublicSuffixListManager 和 DomainParser 的一部分是 PHP registered-domain-libs 的衍生作品。这些代码部分有大量的注释,并且我在此项目中包含了 Apache 软件基金会许可证 2.0 的副本。