web-dev-qa-db-ja.com

php parse_url reverse-解析されたURL

解析されたURLからURLを逆にする方法はありますか?

$url = 'http://www.domain.com/dir/index.php?query=blabla#more_bla';
$parse = parse_url($url);
print_r($parse);
/*
array(
 'scheme'=>'http://',
 etc....
)
*/
$revere = reverse_url($parse); // probably does not exist but u get the point

echo $reverse;
//outputs:// "http://www.domain.com/dir/index.php?query=blabla#more_bla"

または、推奨されるURLの一部が欠落しているURLを検証する方法がある場合。

www.mydomain.com

mydomain.com

すべてがhttp://www.mydomain.comまたは正しいサブドメイン

29
Val

あなたはできるはずです

http_build_url($parse)

注: http_build_url は、pecl_httpをインストールすることによってのみ使用できます。

ドキュメントによると、parse_urlからの出力を処理するように特別に設計されています。どちらの関数もアンカー、クエリパラメータなどを処理するため、「$ urlで言及されていないその他のプロパティ」はありません。

http://がない場合に追加するには、解析する前に基本的なチェックを使用します。

if (strpos($url, "http://") != 0)
    $url = "http://$url";
19
Brad Mace

この関数はトリックを行う必要があります:

/**
 * @param array $parsed
 * @return string
 */
function unparse_url(array $parsed) {
    $get = function ($key) use ($parsed) {
        return isset($parsed[$key]) ? $parsed[$key] : null;
    };

    $pass      = $get('pass');
    $user      = $get('user');
    $userinfo  = $pass !== null ? "$user:$pass" : $user;
    $port      = $get('port');
    $scheme    = $get('scheme');
    $query     = $get('query');
    $fragment  = $get('fragment');
    $authority =
        ($userinfo !== null ? "$userinfo@" : '') .
        $get('Host') .
        ($port ? ":$port" : '');

    return
        (strlen($scheme) ? "$scheme:" : '') .
        (strlen($authority) ? "//$authority" : '') .
        $get('path') .
        (strlen($query) ? "?$query" : '') .
        (strlen($fragment) ? "#$fragment" : '');
}

以下はその短いテストです。

function unparse_url_test() {
    foreach ([
        '',
        'foo',
        'http://www.google.com/',
        'http://u:p@foo:1/path/path?q#frag',
        'http://u:p@foo:1/path/path?#',
        'ssh://root@Host',
        '://:@:1/?#',
        'http://:@foo:1/path/path?#',
        'http://@foo:1/path/path?#',
    ] as $url) {
        $parsed1 = parse_url($url);
        $parsed2 = parse_url(unparse_url($parsed1));

        if ($parsed1 !== $parsed2) {
            print var_export($parsed1, true) . "\n!==\n" . var_export($parsed2, true) . "\n\n";
        }
    }
}

unparse_url_test();
8
Jesse