1

HTTP_HOST 値からサブドメインを抽出しようとしています。ただし、サブドメインに複数のドットが含まれていると、正しく一致しないという問題に遭遇しました。これが複数の異なるドメインで実行するスクリプトであり、ドットの数に制限がなく、tld が 1 つまたは 2 つの部分 (任意の長さ) である可能性があることを考えると、サブドメイン、ドメインを正しく一致させる実用的な方法はありますか?すべての状況でtld?

たとえば、次の HTTP_HOST 値と、一致する必要があるものを取り上げます。

  • www.buggedcom.co.uk
    • サブドメイン: www
    • ドメイン: buggedcom.co.uk
    • TLD: co.uk
  • www.buggedcom.com
    • サブドメイン: www
    • ドメイン: buggedcom.com
    • TLD: コム
  • test.buggedcom.co.uk
    • サブドメイン: テスト
    • ドメイン: buggedcom.co.uk
    • TLD: co.uk
  • test.buggedcom.com
    • サブドメイン: テスト
    • ドメイン: buggedcom.com
    • TLD: コム
  • multi.sub.test.buggedcom.co.uk
    • サブドメイン: multi.sub.test
    • ドメイン: buggedcom.co.uk
    • TLD: co.uk
  • multi.sub.test.buggedcom.com
    • サブドメイン: multi.sub.test
    • ドメイン: buggedcom.com
    • TLD: コム

これを達成する唯一の方法は、tlds のリストをロードすることであると推測しています。

以下は現在のコードです。

define('HOST', isset($_SERVER['HTTP_HOST']) === true ? $_SERVER['HTTP_HOST'] : (isset($_SERVER['SERVER_ADDR']) === true ? $_SERVER['SERVER_ADDR'] : $_SERVER['SERVER_NAME']));
$domain_parts = explode('.', HOST); 
$domain_parts_count = count($domain_parts);
if($domain_parts_count > 1)
{   
    $sub_parts = array_splice($domain_parts, 0, $domain_parts_count-3);
    define('SUBDOMAIN', implode('.', $sub_parts));
    unset($sub_parts);
}
else
{
    define('SUBDOMAIN', '');
}
define('DOMAIN', implode('.', $domain_parts));
var_dump($domain_parts, SUBDOMAIN, DOMAIN);exit;

サブドメインを get パラメータとして mod_rewrite に追加できると思いましたか?

4

4 に答える 4

1

まず、文字列がTLDで終わることを確認するために、スラッシュで分解します(そして配列の最初のインデックスを使用します)。

次に、preg_replaceでカットします。このrexexpは、tldタイプに関係なく、domain+tldと一致します。ただし、これにより2文字と3文字のドメインで問題が発生することに注意してください。しかし、それは正しい方向へのプッシュを与えるはずです...。

[a-zA-Z0-9]+\.(([a-zA-Z]{2,6})|([a-zA-Z]{2,3}\.[a-zA-Z]{2,3}))$

編集:指摘されているように:.museumも可能であるため、TLD部分の最初のパターンを編集しました...。

そしてもちろん、.UKのようなTLDは、co.ukとは異なる動作をする可能性があります。

于 2010-08-05T13:15:14.000 に答える
1

これに対する解決策は、同じことをしようとしている人がうまく処理できると思います... parse_url 関数の PHP ドキュメントへのコメントには、より適切に機能する可能性のあるより優れた URL 解析関数がたくさんあります: http://www.php. net/manual/en/function.parse-url.php

于 2011-08-13T02:47:15.753 に答える
0

preg_match を使用すると、次のように、サブドメインと tld の部分を一度に抽出できます。

function get_domain_parts($domain) {
    $parts = array();
    $pattern = "/(.*)\.buggedcom\.(.*)/";
    if (preg_match($pattern, $domain, $parts) == 1) {
        return array($parts[1], $parts[2]);
    } else {
        return FALSE;
    }
}

$result = get_domain_parts("multi.sub.test.buggedcom.co.uk");
if ($result) {
    echo($result[0] . " and " . $result[1]); // multi.sub.test and co.uk   
}
于 2010-08-05T13:12:32.010 に答える
0

細かいことは言いませんが、技術的に言えば、これ.co.ukは第 2 レベルのドメインです。

.ukはその場合の「国別コード トップ レベル ドメイン」であり、.coは英国によって定義された「商用利用」用です。

ただし、これはあなたの質問には答えないかもしれません。

ウィキペディアには、 TLD のかなり完全なリストがあります。1 つの「ドット」の後に 1 つの「文字列」が続くだけであることがわかります。

于 2010-08-05T13:18:12.267 に答える