関数に入力されたURLのdomain.ext部分を削除するメソッド(または関数)を探しています。ドメイン拡張子は任意(.com、.co.uk、.nl、.whatever)にすることができ、ドメイン拡張子に入力されるURLはhttp://www.domain.comからwww.domain.com/pathまでの任意のものにすることができます。 /script.php?=何でも
これを行うための最良の方法は何ですか?
関数に入力されたURLのdomain.ext部分を削除するメソッド(または関数)を探しています。ドメイン拡張子は任意(.com、.co.uk、.nl、.whatever)にすることができ、ドメイン拡張子に入力されるURLはhttp://www.domain.comからwww.domain.com/pathまでの任意のものにすることができます。 /script.php?=何でも
これを行うための最良の方法は何ですか?
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
)
これを行うには、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などのドメインでも機能します
正規表現を記述して、必要なものを正確に取得することもできます。
これが私の試みです:
$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 は調べていません。
通常または長いドメイン(test_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;
}
これを解決しました...
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でも動作するので、どこでも動作するはずです:)
これに正規表現を使用するのが理にかなっているのかどうかを考えるのに少し時間を費やしましたが、結局はそうではないと思います。
ファーストレスポンダーの正規表現は、それが最善の方法であると私に納得させることに近づきましたが、末尾のスラッシュがないものには機能しませんでした(たとえば、http: //example.com)。私はそれを次のように修正しました: 、しかしそれから私はそれが' http://example.com/index.htm'/\w+\..{2,3}(?:\..{2,3})?(?=[\/\W])/i'
'のようなURLに2回一致することに気づきました。おっと。それはそれほど悪くはありませんが(最初のものを使用するだけです)、次のようなものでも2回一致します:' http ://abc.ed.fg.hij.kl.mn/ '、そして最初の一致は'正しいもの。:(
同僚は、(を介してparse_url()
)ホストを取得し、最後の2つまたは3つの配列ビット(split()
「。」)を取得することを提案しました。2つまたは3つは、「co.uk」などのドメインのリストに基づいています。そのリストを作成することは難しい部分になります。
ドメイン部分を抽出する唯一の正しい方法は、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'
この関数は動作するはずです:
function Delete_Domain_From_Url($Url = false)
{
if($Url)
{
$Url_Parts = parse_url($Url);
$Url = isset($Url_Parts['path']) ? $Url_Parts['path'] : '';
$Url .= isset($Url_Parts['query']) ? "?".$Url_Parts['query'] : '';
}
return $Url;
}
使用するには:
$Url = "https://stackoverflow.com/questions/176284/how-do-you-strip-out-the-domain-name-from-a-url-in-php";
echo Delete_Domain_From_Url($Url);
# Output:
#/questions/176284/how-do-you-strip-out-the-domain-name-from-a-url-in-php