0

変数にURLがあります。

<?php
$a='www.example.com';
?>

このような別の変数があります

<?php
$b='example.com';
?>

$b と $a が同じであることをどのように確認できますか。$b の URL が

'example.com/test','example.com/test.html','www.example.com/example.html'

この場合、$b が $a と等しいことを確認する必要があります。ドメイン名が変更されたような場合はexample.net/example.org、false を返す必要があります。strposとで確認しましstrcmpた。しかし、それが URL の場合の正しいチェック方法だとは思いませんでした。この場合の $b が $a に似ていることをチェックするには、どの関数を使用できますか?

4

3 に答える 3

1

parse_url次のように、URL の解析に使用してルート ドメインを取得できます。

  • http://まだ存在しない場合は URLに追加します
  • PHP_URL_HOST定数を使用して URL のホスト名部分を取得します
  • explode.ドット ( )による URL
  • を使用して、配列の最後の 2 つのチャンクを取得しますarray_slice
  • 結果配列を内破してルート ドメインを取得します

私が作成した小さな関数 (これは、私自身の回答hereの修正版です):

function getRootDomain($url) 
{
    if (!preg_match("~^(?:f|ht)tps?://~i", $url)) {
        $url = "http://" . $url;
    }

    $domain = implode('.', array_slice(explode('.', parse_url($url, PHP_URL_HOST)), -2));
    return $domain;
}

テストケース:

$a = 'http://example.com';
$urls = array(
    'example.com/test',
    'example.com/test.html',
    'www.example.com/example.html',
    'example.net/foobar', 
    'example.org/bar'
    );

foreach ($urls as $url) {
    if(getRootDomain($url) == getRootDomain($a)) {
        echo "Root domain is the same\n";
    }
    else {
        echo "Not same\n";
    }
}

出力:

Root domain is the same
Root domain is the same
Root domain is the same
Not same
Not same

注: この解決策は絶対確実ではなく、次のような URL では失敗するexample.co.uk可能性があり、それが起こらないように追加のチェックが必要になる場合があります。

デモ!

于 2013-09-28T15:06:38.027 に答える
1

を使用parse_urlして重い作業を行い、ホスト名をドットで分割して、最後の 2 つの要素が同じかどうかを確認できます。

$url1 = parse_url($url1);
$url2 = parse_url($url2);

$host_parts1 = explode(".", $url1["host"]);
$host_parts2 = explode(".", $url2["host"]);

if ($host_parts1[count($host_parts1)-1] == $host_parts2[count($host_parts2)-1] &&
   ($host_parts1[count($host_parts1)-2] == $host_parts2[count($host_parts2)-2]) {
   echo "match";
} else {
   echo "no match";
}
于 2013-09-28T14:59:01.333 に答える
0

この回答が役立つと思います: Searching partial strings PHP

とにかくこれらの URL は単なる文字列なので

于 2013-09-28T14:52:39.443 に答える