web-dev-qa-db-ja.com

PHPでURLからドメイン名を削除するにはどうすればよいですか?

関数に渡されるURLのdomain.ext部分を取り除くメソッド(または関数)を探しています。ドメイン拡張子は何でもかまいません(.com、.co.uk、.nl、.whatever)、それに入力されるURLは http://www.domain.com からwww.domain.com/path/script.php?=whatever

これを行うための最善の方法は何ですか?

45
user15063

parse_url は、URLを連想配列に変換します。

php > $foo = "http://www.example.com/foo/bar?hat=bowler&accessory=cane";
php > $blah = parse_url($foo);
php > print_r($blah);
Array
(
    [scheme] => http
    [Host] => www.example.com
    [path] => /foo/bar
    [query] => hat=bowler&accessory=cane
)
96
Robert Elwell

parse_url() を使用してこれを行うことができます。

$url = 'http://www.example.com';
$domain = parse_url($url, PHP_URL_Host);
$domain = str_replace('www.','',$domain);

この例では、wwwの有無にかかわらず、$ domainにexample.comを含める必要があります。 .co.ukなどのドメインでも機能します

12
DavidM

正規表現を記述して、必要なものを正確に取得することもできます。

ここに私の試みがあります:

$pattern = '/\w+\..{2,3}(?:\..{2,3})?(?:$|(?=\/))/i';
$url = 'http://www.example.com/foo/bar?hat=bowler&accessory=cane';
if (preg_match($pattern, $url, $matches) === 1) {
    echo $matches[0];
}

出力は次のとおりです。

example.com

このパターンでは、「example.com.au」などのドメインも考慮されます。

注:関連するRFCを参照していません。

10
firstresponder

以下に、通常または長いドメイン(test.sub.domain.com)またはurl(http://www.example.com)からルートドメイン(example.com)を取得するための簡単な関数をいくつか示します。

/**
 * Get root domain from full domain
 * @param string $domain
 */
public function getRootDomain($domain)
{
    $domain = explode('.', $domain);

    $tld = array_pop($domain);
    $name = array_pop($domain);

    $domain = "$name.$tld";

    return $domain;
}

/**
 * Get domain name from url
 * @param string $url
 */
public function getDomainFromUrl($url)
{
    $domain = parse_url($url, PHP_URL_Host);
    $domain = $this->getRootDomain($domain);

    return $domain;
}
2
Mark Shust

これを解決しました...

Dev.mysite.comを呼び出して、「mysite.com」を抽出したいとします

$requestedServerName = $_SERVER['SERVER_NAME']; // = dev.mysite.com

$thisSite = explode('.', $requestedServerName); // site name now an array

array_shift($thisSite); //chop off the first array entry eg 'dev'

$thisSite = join('.', $thisSite); //join it back together with dots ;)

echo $thisSite; //outputs 'mysite.com'

Mysite.co.ukでも動作するので、どこでも動作するはずです:)

1
z3ro

このために正規表現を使用するのが理にかなっているかどうかを考えるのに少し時間を費やしましたが、最終的にはそうではないと思います。

firstresponderの正規表現は、それが最良の方法であると私に納得させるに近づきましたが、末尾のスラッシュがないものでは動作しませんでした(たとえば http://example.com )。 '/\w+\..{2,3}(?:\..{2,3})?(?=[\/\W])/i'で修正しましたが、「 http://example.com/index.htm 」のようなURLで2回一致することに気付きました。おっとっと。それはそれほど悪いことではありません(最初のものを使用するだけです)が、次のようなものでも2回一致します: ' http://abc.ed.fg.hij.kl.mn/ ' 、そして最初の一致は正しいものではありません。 :(

同僚は、parse_url()を介してホストを取得し、最後の2つまたは3つの配列ビット( '。'のsplit())を取得することを提案しました。 「co.uk」などのドメインのリスト。そのリストを作成するのは難しい部分です。

0
livingtech

ドメイン部分を抽出する正しい方法は1つしかありません。それは Public Suffix List (TLDのデータベース)を使用することです。 TLDExtract パッケージを推奨します。サンプルコードは次のとおりです。

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

$result = $extract->parse('www.domain.com/path/script.php?=whatever');
$result->getSubdomain(); // will return (string) 'www'
$result->getHostname(); // will return (string) 'domain'
$result->getSuffix(); // will return (string) 'com'
0