有没有办法从解析的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"
Run Code Online (Sandbox Code Playgroud)
或者,如果有一种方法验证丢失了部分推荐网址的网址,例如
www.mydomain.com
mydomain.com
应该全部返回
http://www.mydomain.com
或使用正确的子域
Nob*_*ift 23
这些是我用于分解和重建URL的两个函数:
function http_parse_query($query) {
$parameters = array();
$queryParts = explode('&', $query);
foreach ($queryParts as $queryPart) {
$keyValue = explode('=', $queryPart, 2);
$parameters[$keyValue[0]] = $keyValue[1];
}
return $parameters;
}
function build_url(array $parts) {
return (isset($parts['scheme']) ? "{$parts['scheme']}:" : '') .
((isset($parts['user']) || isset($parts['host'])) ? '//' : '') .
(isset($parts['user']) ? "{$parts['user']}" : '') .
(isset($parts['pass']) ? ":{$parts['pass']}" : '') .
(isset($parts['user']) ? '@' : '') .
(isset($parts['host']) ? "{$parts['host']}" : '') .
(isset($parts['port']) ? ":{$parts['port']}" : '') .
(isset($parts['path']) ? "{$parts['path']}" : '') .
(isset($parts['query']) ? "?{$parts['query']}" : '') .
(isset($parts['fragment']) ? "#{$parts['fragment']}" : '');
}
// Example
$parts = parse_url($url);
if (isset($parts['query'])) {
$parameters = http_parse_query($parts['query']);
foreach ($parameters as $key => $value) {
$parameters[$key] = $value; // do stuff with $value
}
$parts['query'] = http_build_query($parameters);
}
$url = build_url($parts);
Run Code Online (Sandbox Code Playgroud)
Bra*_*ace 19
你应该能做到的
http_build_url($parse)
Run Code Online (Sandbox Code Playgroud)
注意:http_build_url仅在安装pecl_http时可用.
根据文档,它是专门为处理输出而设计的parse_url.这两个函数都处理锚点,查询参数等,因此没有"$ url上没有提到的其他属性".
要http://在缺少时添加,请在解析之前使用基本检查:
if (strpos($url, "http://") != 0)
$url = "http://$url";
Run Code Online (Sandbox Code Playgroud)
Jes*_*sse 10
这个功能应该可以解决问题:
/**
* @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" : '');
}
Run Code Online (Sandbox Code Playgroud)
这是一个简短的测试:
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();
Run Code Online (Sandbox Code Playgroud)
这个答案是 @BradMace 接受的答案的附录。我最初将其添加为评论,但他建议将其添加为单独的答案,所以就在这里。
http_build_url($parse)提供的原始答案适用pecl_http于扩展版本1.x- 版本2.x及更高版本是面向对象的并且语法已更改。
在较新的版本(在 上测试pecl_http v.3.2.3)实施应该是:
$httpUrl = new \http\Url($parsed);
$url = $httpUrl->toString();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22463 次 |
| 最近记录: |