Saltar al contenido

php parse_url inverso — URL analizada

Mantén la atención porque en esta división vas a hallar la contestación que buscas.Este artículo fue probado por nuestros especialistas para asegurar la calidad y exactitud de nuestro post.

Solución:

Estas son las dos funciones que utilizo para descomponer y reconstruir 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']) 

// 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);

deberías poder hacer

http_build_url($parse)

NOTA: http_build_url solo está disponible al instalar pecl_http.

De acuerdo con los documentos, está diseñado específicamente para manejar la salida de parse_url. Ambas funciones manejan anclas, parámetros de consulta, etc., por lo que no hay “otras propiedades no mencionadas en $url”.

Para agregar http:// cuando falta, use una verificación básica antes de analizarlo:

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

Esta función debería hacer el truco:

function unparse_url(array $parsed): string 
    $pass      = $parsed['pass'] ?? null;
    $user      = $parsed['user'] ?? null;
    $userinfo  = $pass !== null ? "$user:$pass" : $user;
    $port      = $parsed['port'] ?? 0;
    $scheme    = $parsed['scheme'] ?? "";
    $query     = $parsed['query'] ?? "";
    $fragment  = $parsed['fragment'] ?? "";
    $authority = (
        ($userinfo !== null ? "[email protected]" : "") .
        ($parsed['host'] ?? "") .
        ($port ? ":$port" : "")
    );
    return (
        (strlen($scheme) > 0 ? "$scheme:" : "") .
        (strlen($authority) > 0 ? "//$authority" : "") .
        ($parsed['path'] ?? "") .
        (strlen($query) > 0 ? "?$query" : "") .
        (strlen($fragment) > 0 ? "#$fragment" : "")
    );

Aquí hay una breve prueba para ello:

function unparse_url_test() 
    foreach ([
        '',
        'foo',
        'http://www.google.com/',
        'http://u:[email protected]:1/path/path?q#frag',
        'http://u:[email protected]:1/path/path?#',
        'ssh://[email protected]',
        '://:@: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) . "nn";
        
    


unparse_url_test();

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *