web-dev-qa-db-ja.com

URLからサブドメインと相対アドレスを抽出する

フォームに送信されたURLをサブドメイン、拡張子などを含むURLのすべてのコンポーネント部分に分割する必要があるプラグインを書いています。さらに、送信されたURLの相対アドレスを作成する必要があります。

Wordpressの機能について知っています

wp_parse_url()

しかし、開発者向けドキュメントの例のように、URLを送信した場合 https://developer.wordpress.org/reference/functions/wp_parse_url/ 私は必要な情報の一部しか入手できません。

array (
  'scheme' => 'https',
  'Host' => 'developer.wordpress.org',
  'path' => '/reference/functions/wp_parse_url/',
)

組み込みPHP関数:

parse_url()

これ以上は提供しません。サブドメイン、拡張子などを含むURLからすべてを一度に抽出できるようにする他の機能またはアルゴリズムを知っている人はいますか。

1
WPDavid

私は同様の要求に遭遇し、このための既製の解決策を見つけることができなかったので、私は標準的なPHP function parse_url()に基づく関数を作成し、時間の経過とともにこれに追加しました。私は考えることができました。

以下は私のコードと出力の2つの例です。これにより、サブドメイン、ルートドメイン、tld、拡張子、パス、絶対アドレスなどが抽出されます。

/**
 * Parse and check the URL Sets the following array parameters
 * scheme, Host, port, user, pass, path, query, fragment, dirname, basename, filename, extension, domain, 
 * domainX, absolute address
 * @param string $url of the site
 * @param string $retdata if true then return the parsed URL data otherwise set the $urldata class variable
 * @return array|mixed|boolean
 */
function parseURL($url,$retdata=true){
    $url = substr($url,0,4)=='http'? $url: 'http://'.$url; //assume http if not supplied
    if ($urldata = parse_url(str_replace('&','&',$url))){
        $path_parts = pathinfo($urldata['Host']);
        $tmp = explode('.',$urldata['Host']); $n = count($tmp);
        if ($n>=2){
            if ($n==4 || ($n==3 && strlen($tmp[($n-2)])<=3)){
                $urldata['domain'] = $tmp[($n-3)].".".$tmp[($n-2)].".".$tmp[($n-1)];
                $urldata['tld'] = $tmp[($n-2)].".".$tmp[($n-1)]; //top-level domain
                $urldata['root'] = $tmp[($n-3)]; //second-level domain
                $urldata['subdomain'] = $n==4? $tmp[0]: ($n==3 && strlen($tmp[($n-2)])<=3)? $tmp[0]: '';
            } else {
                $urldata['domain'] = $tmp[($n-2)].".".$tmp[($n-1)];
                $urldata['tld'] = $tmp[($n-1)];
                $urldata['root'] = $tmp[($n-2)];
                $urldata['subdomain'] = $n==3? $tmp[0]: '';
            }
        }
        //$urldata['dirname'] = $path_parts['dirname'];
        $urldata['basename'] = $path_parts['basename'];
        $urldata['filename'] = $path_parts['filename'];
        $urldata['extension'] = $path_parts['extension'];
        $urldata['base'] = $urldata['scheme']."://".$urldata['Host'];
        $urldata['abs'] = (isset($urldata['path']) && strlen($urldata['path']))? $urldata['path']: '/';
        $urldata['abs'] .= (isset($urldata['query']) && strlen($urldata['query']))? '?'.$urldata['query']: '';
        //Set data
        if ($retdata){
            return $urldata;
        } else {
            $this->urldata = $urldata;
            return true;
        }
    } else {
        //invalid URL
        return false;
    }
}

例1:例のURL( https://developer.wordpress.org/reference/functions/wp_parse_url/ )を送信すると、出力は次のようになります。

  array (
    'scheme' => 'https',
    'Host' => 'developer.wordpress.org',
    'path' => '/reference/functions/wp_parse_url/',
    'domain' => 'wordpress.org',
    'tld' => 'org',
    'root' => 'wordpress',
    'subdomain' => 'developer',
    'basename' => 'developer.wordpress.org',
    'filename' => 'developer.wordpress',
    'extension' => 'org',
    'base' => 'https://developer.wordpress.org',
    'abs' => '/reference/functions/wp_parse_url/',
  )

例2:その他に架空のURLが追加された http://dev.yoursite.com/some/other/directory/index.php?pg=7 - 出力は次のようになります。

  array (
    'scheme' => 'http',
    'Host' => 'dev.yoursite.com',
    'path' => '/some/other/directory/index.php',
    'query' => 'pg=7',
    'domain' => 'yoursite.com',
    'tld' => 'com',
    'root' => 'yoursite',
    'subdomain' => 'dev',
    'basename' => 'dev.yoursite.com',
    'filename' => 'dev.yoursite',
    'extension' => 'com',
    'base' => 'http://dev.yoursite.com',
    'abs' => '/some/other/directory/index.php?pg=7',
  )

おそらくあなたが望むよりも多くの情報といくつかの情報は冗長ですが、あなたが必要とするものを正確に得るために関数をわずかに修正するか、あるいはそれをそのまま使用しそして必要な配列の部分を使うことができます。

注: https://developer.wordpress.org をwordpressまたはURL解析関数に組み込まれたPHPに送信した場合、 'path'は出力に定義されません。 parseURL()関数はパスを '/'に設定します。

2
Clinton