php parse_url reverse - 解析url

Val*_*Val 28 php parse-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"
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)

  • 注意:致命错误:调用未定义的函数http_build_url()....我想你可能需要安装一个额外的模块 (8认同)
  • 这里有一个PHP替代品:https://github.com/jakeasmith/http_build_url (5认同)

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)

  • 如果`unparse_url()`只被称为`unparse_url(parse_url(...))`,那是正确的,但当然使用`unparse_url()`的代码将*对*parse_url()的结果执行*`在给`unparse_url()之前`.这可能涉及添加具有空值的键,因此该函数需要正确处理. (2认同)

Mob*_*y04 5

这个答案是 @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)