voku/php-domain-parser

此软件包已被废弃,不再维护。作者建议使用jeremykendall/php-domain-parser软件包。

Fork:基于公共后缀列表的URL解析,使用PHP实现。

8.0.1 2020-04-04 23:51 UTC

README

Build Status codecov.io Scrutinizer Code Quality Codacy Badge SensioLabsInsight Latest Stable Version Total Downloads Latest Unstable Version PHP 7 ready License

PHP域名解析器

警告:这仅是 "https://github.com/jeremykendall/php-domain-parser" 的Fork

PHP域名解析器是一个基于公共后缀列表的域名解析器,使用PHP实现。

动机

虽然有很多优秀的URL解析器和构建器,但很少有项目能够准确地将URL解析为其组件子域、可注册域和公共后缀部分。

以域名 www.pref.okinawa.jp 为例。在此域名中,公共后缀部分是 okinawa.jp,可注册域是 pref.okinawa.jp,子域是 www。这不能用正则表达式完成。

其他类似的库主要关注URL构建、解析和操作,并额外包括公共后缀域名解析。PHP域名解析器从一开始就围绕基于公共后缀列表的准确解析构建,只是为了完整性而简单地添加了一个URL对象。

安装

(目前)唯一支持的方法是通过Composer

在项目根目录中创建一个composer.json文件

{
    "require": {
        "voku/php-domain-parser": "~8.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 $registrableDomain =>
        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->getPublicSuffix();

// $publicSuffix = 'com.au'

IDNA支持

IDN(国际域名)支持在版本1.4.0中添加。支持unicode域名及其ASCII等价物。

Unicode

解析IDNA主机与解析标准主机没有区别。在解析URL示例中设置$host = 'Яндекс.РФ';(俄语西里尔文)将返回

class Pdp\Uri\Url#6 (8) {
  private $scheme =>
  string(0) ""
  private $host =>
  class Pdp\Uri\Url\Host#5 (4) {
    private $subdomain =>
    NULL
    private $registrableDomain =>
    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 $registrableDomain =>
    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 $registrableDomain =>
    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修复错误的拉取请求 中添加了对 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 $registrableDomain =>
    string(6) "b.c.cy"
    private $publicSuffix =>
    string(4) "c.cy"
}

公共后缀验证

通过调用 Parser::isSuffixValid() 可以进行公共后缀验证。

var_dump($parser->isSuffixValid('www.example.faketld');
// false

var_dump($parser->isSuffixValid('www.example.com.au');
// true

如果后缀不在 公共后缀列表 中,则认为它是无效的。

感谢 @SmellyFish 提交 添加验证 TLD 的方法,为项目添加了公共后缀验证。

仅获取域名组件

如果您只对域名组件感兴趣,可以使用解析器仅检索您感兴趣的组件。

<?php

var_dump($parser->getSubdomain('www.scottwills.co.uk'));
var_dump($parser->getRegistrableDomain('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 供应商二进制文件快速从命令行解析 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
    [registrableDomain] => waxaudio.com.au
    [publicSuffix] => com.au
    [port] =>
    [path] => /
    [query] =>
    [fragment] =>
)
Host: http://www.waxaudio.com.au/

示例脚本

有关使用 PHP 域名解析器的更多信息,请参阅提供的 示例脚本

刷新公共后缀列表

虽然提供给您在 data 目录中的 PHP 缓存的公共后缀列表副本,但该副本可能或可能不是最新的(Mozilla 提供了一个 Atom 更改源 以跟踪列表的更改)。请使用提供的供应商二进制文件刷新您缓存的公共后缀列表副本。

从项目根目录,只需调用

$ ./vendor/bin/update-psl

您可以通过检查 data 目录中的文件时间戳来验证更新。

重要:供应商二进制文件 update-psl 依赖于互联网连接来更新缓存的公共后缀列表。

可能意外行为

PHP 域解析器是围绕 PHP 的 parse_url() 函数构建的,因此表现出该函数的大部分行为。就像 parse_url() 一样,这个库并不是用来验证 URL 的,而是将 URL 分解为其组成部分。

一个特定的、令人难以理解的行为是,PHP 域解析器会欣然解析主机部分含有 空格的 URL

贡献

拉取请求总是受欢迎的!请在提交拉取请求之前审查 CONTRIBUTING.md 文档。

注意:所有 1.4 版本的 BC 破坏

1.4 系列通过添加 PHP 的 ext-mbstringext-intl 作为依赖项引入了一个向后不兼容的更改。这应该导致主版本的提升。相反,我将次要版本从 1.3.1 提升至 1.4。

如果您遇到扩展问题,强烈建议您回滚到 1.3.1,并且不想或不能安装 ext-mbstringext-intl。但是,您将失去 IDNA 和 IPv6 支持。这些只在版本 >= 1.4 中可用。

我为由于我的 semver 错误而给您造成的任何问题表示歉意。

归属

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 包含在这个项目中。