12

PHPのparse_url()には、完全なホストを含​​むホストフィールドがあります。ドメインとTLDのみを返す最も信頼性の高い(そして最もコストのかからない)方法を探しています。

例を考えると:

google.comまたはgoogle.co.ukのみを探しています。有効なTLD/サフィックスの表を検討し、それらと1つの単語のみを許可しました。他の方法でやりますか?誰かがこの種のもののために事前に缶詰にされた有効な正規表現を知っていますか?

4

8 に答える 8

17

そのようなものはどうですか?

function getDomain($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)) {
    return $regs['domain'];
  }
  return false;
}

クラシックparse_urlを使用してドメイン名を抽出し、サブドメインのない有効なドメインを探します (www はサブドメインです)。「localhost」などでは機能しません。何にも一致しなかった場合は false を返します。

// 編集:

試してみてください:

echo getDomain('http://www.google.com/test.html') . '<br/>';
echo getDomain('https://news.google.co.uk/?id=12345') . '<br/>';
echo getDomain('http://my.subdomain.google.com/directory1/page.php?id=abc') . '<br/>';
echo getDomain('https://testing.multiple.subdomain.google.co.uk/') . '<br/>';
echo getDomain('http://nothingelsethan.com') . '<br/>';

そして、次のように返されます。

google.com
google.co.uk
google.com
google.co.uk
nothingelsethan.com

もちろん、 を通過できなければ何も返さないparse_urlので、整形式の URL であることを確認してください。

// 補遺:

アルニタクは正しい。上記のソリューションはほとんどの場合に機能しますが、必ずしもすべてではなく、たとえば、.morethan6characters などを含む新しい TLD ではないことを確認するために維持する必要があります。ドメインを抽出する唯一の信頼できる方法は、http://publicsuffix.org/などの管理されたリストを使用することです。最初はより痛みを伴いますが、長期的にはより簡単で堅牢になります. 各方法の長所と短所、およびそれがプロジェクトにどのように適合するかを確実に理解する必要があります。

于 2008-12-30T01:51:39.963 に答える
6

現在、これを行う唯一の「正しい」方法は、http://publicsuffix.org/で維持されているようなリストを使用することです。

ところで、この質問は次のものとほとんど同じです。

IETF では、DNS ツリー内の特定のノードが「パブリック」登録に使用されるかどうかを宣言する DNS メソッドを検討している標準化の取り組みがありますが、それらは開発の初期段階にあります。一般的な非 IE ブラウザはすべて、publicsuffix.org リストを使用しています。

于 2008-12-30T20:47:14.697 に答える
4

Python の tldextract モジュールの非常に優れたポートもありますhttp://w-shadow.com/blog/2012/08/28/tldextract - これは parse_url を超えて、サブドメインなしで実際にドメイン/tld を取得することを可能にします.

モジュールの Web サイトから:

$components = tldextract('http://www.bbc.co.uk');
echo $components->subdomain; // www
echo $components->domain;    // bbc
echo $components->tld;       // co.uk
于 2013-10-02T12:57:12.950 に答える
1

テーブルを維持するというアイデアについては、関連する投稿からこれを掘り下げてください:http: //mxr.mozilla.org/mozilla-central/source/netwerk/dns/src/effective_tld_names.dat?raw= 1

でもそんなことはしたくない。

于 2008-12-30T01:03:35.943 に答える
1

Public Suffix Listを使用するパッケージが必要です。この方法でのみ、2 つ、3 番目のレベルの TLD (co.uk、a.bg、b.bg など) とマルチレベルのサブドメインを持つドメインを正しく抽出できます。正規表現、parse_url()、または文字列関数は絶対に正しい結果を生成しません。

TLD Extractの使用をお勧めします。コードの例:

$extract = new LayerShifter\TLDExtract\Extract();

$result = $extract->parse('http://www.google.co.uk/foo');
$result->getSubdomain(); // will return (string) 'www'
$result->getHostname(); // will return (string) 'google'
$result->getSuffix(); // will return (string) 'co.uk'
$result->getRegistrableDomain(); // will return (string) 'google.co.uk'
于 2016-07-01T14:46:08.677 に答える
0

もちろん、それはあなたの特定のユースケースに依存しますが、一般的に言えば、私はTLDのテーブルルックアップを使用しません。新しいTLDが出てきて、通常はどこにも維持したくありません。私のfirstname@lastname.nameが近視のために拒否された頻度を聞いてください。

なぜあなたがwwwを望まないのかを知っていれば、私はもっとよく助けることができると思いますか?メールに必要ですか?このような場合にMXレコードをクエリして、(最終的には)メールを受け入れることを確認できます。

DNSレコードを処理するPHP関数のヘルプを見つけて、DNSレコードの詳細を確認することもできます。たとえば、 http://php.net/dns_get_recordを参照してください。

于 2008-12-30T01:06:49.557 に答える
0

許可されたtldがハッシュに記憶されていると仮定して、単なる証拠です。コードは大幅に短縮できます。

<?php
    $urlCompoments=parse_url($theUrl);
    $chunk=explode('.',$urlComponents['host']);

    $tldIndex = count($chunk-1); // assume last chunk is tld
    $maxTldLen = 2; // assuming a tld can be in the form .com or .co.uk
    $cursor=1;
    $found=false;
    while(($cursor<=$maxTldLen) or $found) {
      $tls = implode('.',array_slice($chunk, -$cursor));
      $found=isset($tldSuffixesAllowed[$tld]);
      $cursor++;
    }
    if ($found){
       $tld=implode('.',array_slice($chunk, -$cursor));
    } else {
       // domain not recognized, do wathever you want
    }
?>
于 2008-12-30T01:39:40.910 に答える
-3

これには本当に簡単な解決策があります:

function get_domain($url) {
  $pieces = parse_url($url);
  return array_pop(explode('.', $pieces['host'], 2));
}

確かにこれはうまくいくでしょうか?

于 2009-01-01T01:29:12.347 に答える