有趣的问题。我已经摆弄了一段时间;这种方法不可避免地并不完美,但它可能会让你走上正确的道路。
我的解决方案从这个存储库中的两个源文件开始:https ://github.com/usrflo/registered-domain-libs/tree/master/PHP
首先,如果您的 php 版本中不推荐使用 split ,您可能需要修改 regDomain.inc.php 以更改 to 的实例$signingDomainParts = split('\.', $signingDomain);。$signingDomainParts = preg_split('/\./', $signingDomain);
一旦你保存了这些,试试这个测试代码,我把线程中提到的所有 URL 作为测试用例:
<?php
require_once("effectiveTLDs.inc.php");
require_once("regDomain.inc.php");
$tests = Array("/images/sample.jpg","//main.com/images/sample.jpg","images/sample.jpg", "sub.main.com/images/sample.jpg", "http://www.example.com/www.google.com/sample.jpg", "amazon.co.uk/images/sample.jpg", "amazon.com/images/sample.jpg", "http://sub2.sub.main.co.uk/images/sample.jpg", "sub2.sub.main.co.uk/images/sample.jpg");
foreach($tests as $test)
{
    echo "Attempting $test.<BR/>";
    $one = parse_url($test);
    if(!array_key_exists("host", $one))
    {
        echo "Converting to: http://$test";
        echo "<BR/>";
        $one = parse_url("http://$test");
    }
    if(!$one){echo "<BR/>";continue;}
    echo "parse_url parts: ";
    print_r($one);
    echo "<BR/>";
    if($one && array_key_exists("host", $one))
    {
        $domain = getRegisteredDomain($one["host"], $tldTree);
        if(sizeof($domain))
        {
            $two = explode(".", $domain);
            echo "domain parts: ";
            print_r($two);
            echo "<BR/>";
            if(sizeof($two))
            {
                $three = array_diff(explode(".", $one["host"]), $two);
                if(sizeof($three))
                {
                    echo "Hark! A subdomain!: ";
                    print_r($three);
                    echo "<BR/>";
                }
            }
        }
    }
    echo "<BR/>";
}
?>
此代码将以下测试用例标识为具有子域:
Attempting sub.main.com/images/sample.jpg.
Hark! A subdomain!: Array ( [0] => sub ) 
Attempting http://www.example.com/www.google.com/sample.jpg.
Hark! A subdomain!: Array ( [0] => www ) 
Attempting http://sub2.sub.main.co.uk/images/sample.jpg.
Hark! A subdomain!: Array ( [0] => sub2 [1] => sub ) 
Attempting sub2.sub.main.co.uk/images/sample.jpg.
Hark! A subdomain!: Array ( [0] => sub2 [1] => sub )