php-URLからドメインを解析する
URLからドメインを解析する関数を作成する必要があります。
つまり、
http://google.com/dhasjkdas/sadsdds/sdda/sdads.html
または
http://www.google.com/dhasjkdas/sadsdds/sdda/sdads.html
google.com
with
http://google.co.uk/dhasjkdas/sadsdds/sdda/sdads.html
google.co.uk
を返す必要があります。
答え :
解決策:
parse_url()
をチェックしてください:
$url = 'http://google.com/dhasjkdas/sadsdds/sdda/sdads.html';
$parse = parse_url($url);
echo $parse['host']; // prints 'google.com'
parse_url
は、非常にひどく壊れたURLをうまく処理しませんが、一般的にまともなURLを期待している場合は問題ありません。
答え :
解決策:
$domain = str_ireplace('www.', '', parse_url($url, PHP_URL_HOST));
これにより、 http:// google.com /...との両方のgoogle.com
が返されます。 http://www。google.com/ ...
答え :
解決策:
http://us3.php.net/manual/en/function.parse-url.php#93983から
奇妙な理由で、parse_url ホスト(例:example.com)を次のように返します スキームが提供されていない場合のパス 入力URL。だから私は簡単に書いた 実際のホストを取得する関数:
function getHost($Address) { $parseUrl = parse_url(trim($Address)); return trim($parseUrl['host'] ? $parseUrl['host'] : array_shift(explode('/', $parseUrl['path'], 2))); } getHost("example.com"); // Gives example.com getHost("http://example.com"); // Gives example.com getHost("www.example.com"); // Gives www.example.com getHost("http://example.com/xyz"); // Gives example.com
答え :
解決策:
function get_domain($url = SITE_URL)
{
preg_match("/[a-z0-9\-]{1,63}\.[a-z\.]{2,6}$/", parse_url($url, PHP_URL_HOST), $_domain_tld);
return $_domain_tld[0];
}
get_domain('http://www.cdl.gr'); //cdl.gr
get_domain('http://cdl.gr'); //cdl.gr
get_domain('http://www2.cdl.gr'); //cdl.gr
答え :
解決策:
100%動作するように意図されたコードは、私にとってはうまくいかなかったようです。例に少しパッチを当てましたが、役に立たないコードと問題が見つかりました。 。そこで、私はそれをいくつかの関数に変更しました(Mozillaからのリストの要求を常に保存し、キャッシュシステムを削除するため)。これは1000個のURLのセットに対してテストされており、機能しているようです。
function domain($url)
{
global $subtlds;
$slds = "";
$url = strtolower($url);
$host = parse_url('http://'.$url,PHP_URL_HOST);
preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);
foreach($subtlds as $sub){
if (preg_match('/\.'.preg_quote($sub).'$/', $host, $xyz)){
preg_match("/[^\.\/]+\.[^\.\/]+\.[^\.\/]+$/", $host, $matches);
}
}
return @$matches[0];
}
function get_tlds() {
$address = 'http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1';
$content = file($address);
foreach ($content as $num => $line) {
$line = trim($line);
if($line == '') continue;
if(@substr($line[0], 0, 2) == '/') continue;
$line = @preg_replace("/[^a-zA-Z0-9\.]/", '', $line);
if($line == '') continue; //$line = '.'.$line;
if(@$line[0] == '.') $line = substr($line, 1);
if(!strstr($line, '.')) continue;
$subtlds[] = $line;
//echo "{$num}: '{$line}'"; echo "<br>";
}
$subtlds = array_merge(array(
'co.uk', 'me.uk', 'net.uk', 'org.uk', 'sch.uk', 'ac.uk',
'gov.uk', 'nhs.uk', 'police.uk', 'mod.uk', 'asn.au', 'com.au',
'net.au', 'id.au', 'org.au', 'edu.au', 'gov.au', 'csiro.au'
), $subtlds);
$subtlds = array_unique($subtlds);
return $subtlds;
}
次に、次のように使用します
$subtlds = get_tlds();
echo domain('www.example.com') //outputs: example.com
echo domain('www.example.uk.com') //outputs: example.uk.com
echo domain('www.example.fr') //outputs: example.fr
これをクラスに変えるべきだったのはわかっていますが、時間がありませんでした。
答え :
解決策:
文字列http://google.com/dhasjkdas/sadsdds/sdda/sdads.html
からホストを抽出する場合は、parse_url()の使用が許容できる解決策です。
ただし、ドメインまたはその一部を抽出する場合は、公開サフィックスリストを使用したパッケージが必要です。はい、parse_url()の周りで文字列関数を使用できますが、誤った結果が生成される場合があります。
ドメイン解析にはTLDExtractをお勧めします。diffを表示するサンプルコードは次のとおりです:
$ extract = new LayerShifter \ TLDExtract \ Extract();
#「http://google.com/dhasjkdas/sadsdds/sdda/sdads.html」の場合
$ url ='http://google.com/dhasjkdas/sadsdds/sdda/sdads.html';
parse_url($ url、PHP_URL_HOST); //google.comを返します
$ result = $ extract-> parse($ url);
$ result-> getFullHost(); //「google.com」を返します
$ result-> getRegistrableDomain(); //「google.com」を返します
$ result-> getSuffix(); //'com'を返します
#「http://search.google.com/dhasjkdas/sadsdds/sdda/sdads.html」の場合
$ url ='http://search.google.com/dhasjkdas/sadsdds/sdda/sdads.html';
parse_url($ url、PHP_URL_HOST); //'search.google.com'を返します
$ result = $ extract-> parse($ url);
$ result-> getFullHost(); //'search.google.com'を返します
$ result-> getRegistrableDomain(); //「google.com」を返します
答え :
解決策:
受け入れられた解決策を次のように置き換えることを検討してください:
parse_url()には常にサブドメインが含まれるため、この関数はドメイン名を適切に解析しません。 次にいくつかの例を示します。
$url = 'http://www.google.com/dhasjkdas/sadsdds/sdda/sdads.html';
$parse = parse_url($url);
echo $parse['host']; // prints 'www.google.com'
echo parse_url('https://subdomain.example.com/foo/bar', PHP_URL_HOST);
// Output: subdomain.example.com
echo parse_url('https://subdomain.example.co.uk/foo/bar', PHP_URL_HOST);
// Output: subdomain.example.co.uk
代わりに、この実用的な解決策を検討することもできます。 すべてではありませんが、多くのドメイン名をカバーします。たとえば、「sos.state.oh.us」などの下位レベルのドメインはカバーされません。
function getDomain($url) {
$host = parse_url($url, PHP_URL_HOST);
if(filter_var($host,FILTER_VALIDATE_IP)) {
// IP address returned as domain
return $host; //* or replace with null if you don't want an IP back
}
$domain_array = explode(".", str_replace('www.', '', $host));
$count = count($domain_array);
if( $count>=3 && strlen($domain_array[$count-2])==2 ) {
// SLD (example.co.uk)
return implode('.', array_splice($domain_array, $count-3,3));
} else if( $count>=2 ) {
// TLD (example.com)
return implode('.', array_splice($domain_array, $count-2,2));
}
}
// Your domains
echo getDomain('http://google.com/dhasjkdas/sadsdds/sdda/sdads.html'); // google.com
echo getDomain('http://www.google.com/dhasjkdas/sadsdds/sdda/sdads.html'); // google.com
echo getDomain('http://google.co.uk/dhasjkdas/sadsdds/sdda/sdads.html'); // google.co.uk
// TLD
echo getDomain('https://shop.example.com'); // example.com
echo getDomain('https://foo.bar.example.com'); // example.com
echo getDomain('https://www.example.com'); // example.com
echo getDomain('https://example.com'); // example.com
// SLD
echo getDomain('https://more.news.bbc.co.uk'); // bbc.co.uk
echo getDomain('https://www.bbc.co.uk'); // bbc.co.uk
echo getDomain('https://bbc.co.uk'); // bbc.co.uk
// IP
echo getDomain('https://1.2.3.45'); // 1.2.3.45
最後に、JeremyKendallのPHPドメインパーサーを使用すると、URLからドメイン名を解析できます。 リーグURIホスト名パーサーもその役割を果たします。
答え :
解決策:
これは、mozilla sub tldsを考慮に入れるため、100%がドメイン名のみを検出するように作成したコードです。チェックする必要があるのは、そのファイルのキャッシュを作成する方法だけなので、毎回Mozillaにクエリを実行する必要はありません。
奇妙な理由で、co.ukのようなドメインはリストに含まれていないため、ハッキングを行って手動で追加する必要があります。それは最もクリーンな解決策ではありませんが、誰かに役立つことを願っています。
//=====================================================
static function domain($url)
{
$slds = "";
$url = strtolower($url);
$address = 'http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1';
if(!$subtlds = @kohana::cache('subtlds', null, 60))
{
$content = file($address);
foreach($content as $num => $line)
{
$line = trim($line);
if($line == '') continue;
if(@substr($line[0], 0, 2) == '/') continue;
$line = @preg_replace("/[^a-zA-Z0-9\.]/", '', $line);
if($line == '') continue; //$line = '.'.$line;
if(@$line[0] == '.') $line = substr($line, 1);
if(!strstr($line, '.')) continue;
$subtlds[] = $line;
//echo "{$num}: '{$line}'"; echo "<br>";
}
$subtlds = array_merge(Array(
'co.uk', 'me.uk', 'net.uk', 'org.uk', 'sch.uk', 'ac.uk',
'gov.uk', 'nhs.uk', 'police.uk', 'mod.uk', 'asn.au', 'com.au',
'net.au', 'id.au', 'org.au', 'edu.au', 'gov.au', 'csiro.au',
),$subtlds);
$subtlds = array_unique($subtlds);
//echo var_dump($subtlds);
@kohana::cache('subtlds', $subtlds);
}
preg_match('/^(http:[\/]{2,})?([^\/]+)/i', $url, $matches);
//preg_match("/^(http:\/\/|https:\/\/|)[a-zA-Z-]([^\/]+)/i", $url, $matches);
$host = @$matches[2];
//echo var_dump($matches);
preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);
foreach($subtlds as $sub)
{
if (preg_match("/{$sub}$/", $host, $xyz))
preg_match("/[^\.\/]+\.[^\.\/]+\.[^\.\/]+$/", $host, $matches);
}
return @$matches[0];
}
答え :
解決策:
PHP_URL_HOSTを2番目のパラメーターとしてparse_url関数に渡すことができます
$url = 'http://google.com/dhasjkdas/sadsdds/sdda/sdads.html';
$host = parse_url($url, PHP_URL_HOST);
print $host; // prints 'google.com'
答え :
解決策:
@philfreoの解決策(php.netから参照)は、良好な結果を得るのに非常に適していることがわかりましたが、場合によっては、phpの「通知」と「厳格な基準」のメッセージが表示されます。 。ここに、このコードの修正バージョンがあります。
function getHost($url) {
$parseUrl = parse_url(trim($url));
if(isset($parseUrl['host']))
{
$host = $parseUrl['host'];
}
else
{
$path = explode('/', $parseUrl['path']);
$host = $path[0];
}
return trim($host);
}
echo getHost("http://example.com/anything.html"); // example.com
echo getHost("http://www.example.net/directory/post.php"); // www.example.net
echo getHost("https://example.co.uk"); // example.co.uk
echo getHost("www.example.net"); // example.net
echo getHost("subdomain.example.net/anything"); // subdomain.example.net
echo getHost("example.net"); // example.net
答え :
解決策:
function getTrimmedUrl($link)
{
$str = str_replace(["www.","https://","http://"],[''],$link);
$link = explode("/",$str);
return strtolower($link[0]);
}
答え :
解決策:
$domain = parse_url($url, PHP_URL_HOST);
echo implode('.', array_slice(explode('.', $domain), -2, 2))
答え :
解決策:
parse_urlが機能しませんでした。パスのみを返しました。 php5.3 +を使用して基本に切り替える:
$url = str_replace('http://', '', strtolower( $s->website));
if (strpos($url, '/')) $url = strstr($url, '/', true);
答え :
解決策:
編集しました:
function getHost($Address) {
$parseUrl = parse_url(trim($Address));
$host = trim($parseUrl['host'] ? $parseUrl['host'] : array_shift(explode('/', $parseUrl['path'], 2)));
$parts = explode( '.', $host );
$num_parts = count($parts);
if ($parts[0] == "www") {
for ($i=1; $i < $num_parts; $i++) {
$h .= $parts[$i] . '.';
}
}else {
for ($i=0; $i < $num_parts; $i++) {
$h .= $parts[$i] . '.';
}
}
return substr($h,0,-1);
}
すべてのタイプのURL(www.domain.ltd、sub1.subn.domain.ltdは:domain.ltdになります。
答え :
解決策:
これはGoogleで最もポップアップする回答なので、遅く追加します...
PHPを使用して...
$url = "www.google.co.uk";
$host = parse_url($url, PHP_URL_HOST);
// $host == "www.google.co.uk"
ホストを取得するが、ホストが参照するプライベートドメインを取得しない。 (例 www.google.co.uk
はホストですが、 google.co.uk
はプライベートドメインです)
プライベートドメインを取得するには、プライベートドメインを登録できるパブリックサフィックスのリストを知っている必要があります。このリストは、Mozillaによって https://publicsuffix.org/
でキュレーションされています。以下のコードは、パブリックサフィックスの配列がすでに作成されている場合に機能します。電話するだけです
$ domain = get_private_domain( "www.google.co.uk");
残りのコードを含む...
// find some way to parse the above list of public suffix
// then add them to a PHP array
$suffix = [... all valid public suffix ...];
function get_public_suffix($host) {
$parts = split("\.", $host);
while (count($parts) > 0) {
if (is_public_suffix(join(".", $parts)))
return join(".", $parts);
array_shift($parts);
}
return false;
}
function is_public_suffix($host) {
global $suffix;
return isset($suffix[$host]);
}
function get_private_domain($host) {
$public = get_public_suffix($host);
$public_parts = split("\.", $public);
$all_parts = split("\.", $host);
$private = [];
for ($x = 0; $x < count($public_parts); ++$x)
$private[] = array_pop($all_parts);
if (count($all_parts) > 0)
$private[] = array_pop($all_parts);
return join(".", array_reverse($private));
}
答え :
解決策:
これは、入力URLが完全にジャンクでない場合、通常は非常にうまく機能します。サブドメインを削除します。
$host = parse_url( $Row->url, PHP_URL_HOST );
$parts = explode( '.', $host );
$parts = array_reverse( $parts );
$domain = $parts[1].'.'.$parts[0];
例
入力: http://www2.website.com:8080/some/file/structure?some=parameters
出力: website.com
答え :
解決策:
worldofjrとAlixAxel の回答を組み合わせて、ほとんどのユースケースを処理する1つの小さな関数にします。
function get_url_hostname($url) {
$parse = parse_url($url);
return str_ireplace('www.', '', $parse['host']);
}
get_url_hostname('http://www.google.com/example/path/file.html'); // google.com
答え :
解決策:
このテストケースを使用した場合、この解決策はどれもうまくいきませんでした:
public function getTestCases(): array
{
return [
//input expected
['http://google.com/dhasjkdas', 'google.com'],
['https://google.com/dhasjkdas', 'google.com'],
['https://www.google.com/dhasjkdas', 'google.com'],
['http://www.google.com/dhasjkdas', 'google.com'],
['www.google.com/dhasjkdas', 'google.com'],
['google.com/dhasjkdas', 'google.com'],
];
}
ただし、この回答を関数にラップすることはすべての場合に機能しました: https://stackoverflow.com/a/65659814/5884988
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。