解析された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
または正しいサブドメイン
あなたはできるはずです
http_build_url($parse)
注: http_build_url は、pecl_httpをインストールすることによってのみ使用できます。
ドキュメントによると、parse_url
からの出力を処理するように特別に設計されています。どちらの関数もアンカー、クエリパラメータなどを処理するため、「$ urlで言及されていないその他のプロパティ」はありません。
http://
がない場合に追加するには、解析する前に基本的なチェックを使用します。
if (strpos($url, "http://") != 0)
$url = "http://$url";
この関数はトリックを行う必要があります:
/**
* @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();