3

スキーム/ホストが存在しない場合、文字列にサブドメインが存在するかどうかを確認するにはどうすればよいですか。

例えば:$url="sub.main.com/images/sample.jpg";

画像のURLを解析しようとしていますが、parse_urlほとんどの場合に使用しています。

しかし、URL文字列を考えると、さまざまなフレーバーがあります。例:

/images/sample.jpg
//main.com/images/sample.jpg
images/sample.jpg

など、私はさまざまなケースを1つずつ対処しようとしています。現在、文字列にサブドメインが存在するかどうかを検出するのは難しいと感じています。

したがって、$ url = "sub.main.com/images/sample.jpg"; `などの文字列の場合はサブドメインを抽出し、images/sample.jpgなどの文字列の場合は調べます。サブドメインがないこと

4

4 に答える 4

1

興味深い問題。私はしばらくこれをいじっています。この方法は必然的に完璧ではありませんが、正しい道を歩み始める可能性があります。

私のソリューションは、このリポジトリ内の2つのソースファイルから始まります:https ://github.com/usrflo/registered-domain-libs/tree/master/PHP

まず、 phpバージョンでsplitが非推奨になった場合$signingDomainParts = split('\.', $signingDomain);に、のインスタンスをに変更するためにregDomain.inc.phpを変更する必要がある場合があります。$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 )
于 2013-02-02T19:51:53.923 に答える
0

このコードを試してください

<?php
$url = 'sub.main.com/images/sample.jpg';    
$arr = explode('/',$url);

$domain = $arr[0];
$string = $arr[1];

$arr2 = explode('.',$domain);

if(count($arr2)>2) {
    $subdomain = $arr2[0];
    echo $subdomain;
}
?>
于 2013-02-02T18:00:45.020 に答える
0
<?php
$url = 'http://sub.main.com/images/sample.jpg';
$arr = explode('/',$url);

$pieces = parse_url($url);

$domain = isset($pieces['host']) ? $pieces['host'] : '';
if (preg_match('/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i', $domain, $regs)) 
{ 
  $main_domain=$regs['domain'];
}

$host=$pieces['host'];
$path=$pieces['path'];

if($host != $main_domain)
{
    $arr2 = explode('.',$host); 
    $subdomain = $arr2[0];
    echo $subdomain;
}

$string=substr($path,1,strlen($path));

?>
于 2013-02-02T19:01:53.183 に答える
-1

次のことを試してください。

<?php
$url="sub.main.com/images/sample.jpg";

preg_match('@^(?:http://)?([^.]+).?([^/]+)@i',$url, $hits);
print_r($hits);
?>

これにより、次のように出力されます。

Array ( [0] => sub.main.com [1] => sub [2] => main.com )
于 2013-02-02T17:35:20.650 に答える