2010-12-04 21 views
13

¿Hay alguna manera de revertir la URL desde una URL analizada?php parse_url reverse - url analizado

$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" 

O si hay una manera de validar una URL que falta parte de sus direcciones URL recomendados por ejemplo

www.mydomain.com

mydomain.com

todos deben volver http://www.mydomain.com o con sub dominio correcto

+0

He echado un vistazo a 'http_build_url' pero parece una molestia si las URL difieren tienen otras propiedades no mencionadas en' $ url' – Val

+0

Ni 'www.example.com' ni' example.com' son válidos URLs se interpretaría como ruta URL. – Gumbo

Respuesta

11

Debería poder hacer

http_build_url($parse) 

De acuerdo con la documentación que está diseñado específicamente para manejar la salida de parse_url. Ambas funciones manejan anclajes, parámetros de consulta, etc. por lo que no hay "otras propiedades que no se mencionan en la URL $".

Para añadir http:// cuando falta, utilice una comprobación básica antes de analizarlo:

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

mi problema es (tal vez estoy pensando en ello) pero ¿qué pasa si 'http: //' es 'https: //' ya que no es muy común, pero los sitios web de comercio electrónico tienen esta característica. Estoy desarrollando esto como un sistema cms y deffently necesitarán usar https u otros protocolos, y a veces puertos. ¿lo manejaría correctamente? – Val

+0

La única manera de averiguarlo es intentar realizar una solicitud al sitio web en cuestión. Para eso, puede ver http://php.net/manual/en/function.httprequest-send.php –

+8

NOTA: Error fatal: llamada a la función indefinida http_build_url() ....Creo que es posible que necesites instalar un módulo adicional – Val

5

Esta función debe hacer el truco:

/** 
* @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 ? "[email protected]" : '') . 
     $get('host') . 
     ($port ? ":$port" : ''); 

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

Aquí está una prueba corta 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) . "\n\n"; 
     } 
    } 
} 

unparse_url_test(); 
+0

Llamar 'isset' para cada parte de URL seguido de un' strlen' es ineficaz porque 'parse_url' solo rellena el conjunto de retorno con partes que tienen un valor. Las únicas llamadas 'strlen' que devuelven falso pasan nulo en su código, e incluso entonces sería más eficiente comparar con nulo que llamar a una función. – NobleUplift

+0

Para ampliar mi punto, parse_url devuelve 'array (" ruta "=>": //: @: 1/")' para la última URL en su ejemplo. Elimina por completo '" query "' y '" fragment "'. – NobleUplift

+1

Eso es cierto si 'unparse_url()' solo se llama como 'unparse_url (parse_url (...))', pero por supuesto el código que usa 'unparse_url()' va a * hacer algo * al resultado de 'parse_url () 'antes de dar a' unparse_url() '. Esto puede implicar la adición de claves con valores vacíos, por lo que esta función debe manejarlo correctamente. – Jesse

12

Estas son las dos funciones que uso 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']) || 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); 
0

Otra IMPLEMENTACIÓN:

function build_url(array $elements) { 
    $e = $elements; 
    return 
     (isset($e['host']) ? (
      (isset($e['scheme']) ? "$e[scheme]://" : '//') . 
      (isset($e['user']) ? $e['user'] . (isset($e['pass']) ? ":$e[pass]" : '') . '@' : '') . 
      $e['host'] . 
      (isset($e['port']) ? ":$e[port]" : '') 
     ) : '') . 
     (isset($e['path']) ? $e['path'] : '/') . 
     (isset($e['query']) ? '?' . (is_array($e['query']) ? http_build_query($e['query'], '', '&') : $e['query']) : '') . 
     (isset($e['fragment']) ? "#$e[fragment]" : '') 
    ; 
} 

Los resultados deben ser:

{ 
    "host": "example.com" 
} 
/* //example.com/ */ 

{ 
    "scheme": "https", 
    "host": "example.com" 
} 
/* https://example.com/ */ 

{ 
    "scheme": "http", 
    "host": "example.com", 
    "port": 8080, 
    "path": "/x/y/z" 
} 
/* http://example.com:8080/x/y/z */ 

{ 
    "scheme": "http", 
    "host": "example.com", 
    "port": 8080, 
    "user": "anonymous", 
    "query": "a=b&c=d", 
    "fragment": "xyz" 
} 
/* http://[email protected]:8080/?a=b&c=d#xyz */ 

{ 
    "scheme": "http", 
    "host": "example.com", 
    "user": "root", 
    "pass": "stupid", 
    "path": "/x/y/z", 
    "query": { 
     "a": "b", 
     "c": "d" 
    } 
} 
/* http://root:[email protected]/x/y/z?a=b&c=d */ 

{ 
    "path": "/x/y/z", 
    "query": "a=b&c=d" 
} 
/* /x/y/z?a=b&c=d */ 
0

Recuperación de la última cadena de url por ejemplo: http://example.com/controllername/functionname y la necesidad de conseguir functionname

$ árbitro = explotar ('/', strrev ($ _ SERVER ['HTTP_REFERER'] ]));

$ lastString = strrev ($ referer [0]);