2011-01-24 13 views
13

Los usuarios pueden ingresar URL usando un formulario HTML en mi sitio web, por lo que pueden escribir algo como esto: http://www.example.com?test=123&random=abc, puede ser cualquier cosa. Necesito extraer el valor de un cierto parámetro de consulta, en este caso 'prueba' (el valor 123). ¿Hay alguna forma de hacer esto?¿Cómo extraigo los parámetros de consulta de una cadena URL en PHP?

+4

posible duplicado de [la expresión regular para analizar la cadena de consulta] (http://stackoverflow.com/questions/4499538/regular-expression-to-parse-query-string) – Gordon

+0

De hecho, un duplicado, sin embargo, la solución parse_url conduce a un nuevo problema, mira mi comentario a user576875 a continuación. –

+1

puedes extraer la cadena comenzando desde '?' Con 'strstr' o' explotar 'algo y luego pasarla a 'parse_str' – Gordon

Respuesta

43

Puede utilizar parse_url y parse_str así:

$query = parse_url('http://www.example.com?test=123&random=abc', PHP_URL_QUERY); 
parse_str($query, $params); 
$test = $params['test']; 

parse_url permite dividir una dirección URL en diferentes partes (esquema, host, ruta, consulta, etc.); aquí lo usamos para obtener solo la consulta (test=123&random=abc). Entonces podemos analizar la consulta con parse_str.

+0

Parece que parse_url arroja un error de PHP cuando usa ciertas URL, vea este comentario en php.net: http://www.php.net/manual/en/function.parse-url.php#96433 –

+1

Sí, parece que no funciona en las URL sin ' componente del host' Esto funcionará con URL válidas similares a HTTP. – arnaud576875

+0

Entonces, ¿hay alguna otra manera de hacer esto? –

2

Necesitaba comprobar una URL que era relativa para nuestro sistema, así que no pude usar parse_str. Para cualquier persona que lo necesite:

$urlParts = null; 
preg_match_all("~[\?&]([^&]+)=([^&]+)~", $url, $urlParts); 
+0

solo por curiosidad, pero ¿cómo es que su sistema no es compatible con una función PHP nativa? – Vallentin

+0

@Vallentin - 'parse_str()' se introdujo en PHP 4 ... tal vez (pero es mucho improbabile) que tenía una versión anterior de PHP –

0

el nombre de host es opcional, pero se requiere al menos el signo de interrogación en el inicio de la cadena de parámetros:

$inputString = '?test=123&random=abc&usersList[]=1&usersList[]=2' ; 

parse_str (parse_url ($inputString , PHP_URL_QUERY) , $params); 

print_r ($params); 
Cuestiones relacionadas