¿Cómo obtener parámetros de una cadena URL?


197

Tengo un campo de formulario HTML que $_POST["url"]tiene algunas cadenas URL como valor. Los valores de ejemplo son:

https://example.com/test/1234?email=xyz@test.com
https://example.com/test/1234?basic=2&email=xyz2@test.com
https://example.com/test/1234?email=xyz3@test.com
https://example.com/test/1234?email=xyz4@test.com&testin=123
https://example.com/test/the-page-here/1234?someurl=key&email=xyz5@test.com

etc.

¿Cómo puedo obtener solo el emailparámetro de estas URL / valores?

Tenga en cuenta que no obtengo estas cadenas de la barra de direcciones del navegador.


Estoy un poco confundido, por favor elabore la Q ...
Dexter Huinda

¿Está diciendo / solicitando que las URL se traten como cadenas?
hjpotter92

Si desea "hacer coincidir" la parte del correo electrónico de cadenas, como en sus ejemplos, use expresiones regulares. Podría ser tan simple como /(email=\w\@\w\.\w)/o técnicas de emparejamiento más avanzadas. Solo te estoy dando la idea. Ver preg_matchfunción: php.net/manual/en/function.preg-match.php
Dexter Huinda


Posible duplicado de la cadena de consulta Get URL
jww

Respuestas:


414

Puedes usar el parse_url()y parse_str()para eso.

$parts = parse_url($url);
parse_str($parts['query'], $query);
echo $query['email'];

Si desea obtener $urldinámicamente con PHP, eche un vistazo a esta pregunta:

Obtenga la URL completa en PHP


2
está funcionando pero recibo un error en registros como este: Aviso PHP: Índice indefinido: consulta
Srinivas08

112

?Se puede acceder a todos los parámetros después usando $_GETarray. Entonces,

echo $_GET['email'];

extraerá los correos electrónicos de las URL.


50
Esta no es la respuesta a la pregunta, pero esta es la respuesta que estaba buscando cuando le pregunté a los Google por la pregunta, así que +1 para responder a Google correctamente.
BillyNair

1
Puede que esta no sea la respuesta a la pregunta, pero es la forma correcta y más fácil de obtener los parámetros de URL, si están configurados correctamente: https://example.com?email=myemail@example.com $email = $_GET['email']; $email === 'myemail@example.com';
CheddarMonkey

45

Utilice los métodos parse_url () y parse_str () . parse_url()analizará una cadena de URL en una matriz asociativa de sus partes. Dado que solo desea una sola parte de la URL, puede usar un acceso directo para devolver un valor de cadena con solo la parte que desea. A continuación, parse_str()creará variables para cada uno de los parámetros en la cadena de consulta. No me gusta contaminar el contexto actual, por lo que proporcionar un segundo parámetro coloca todas las variables en una matriz asociativa.

$url = "https://mysite.com/test/1234?email=xyz4@test.com&testin=123";
$query_str = parse_url($url, PHP_URL_QUERY);
parse_str($query_str, $query_params);
print_r($query_params);

//Output: Array ( [email] => xyz4@test.com [testin] => 123 ) 

8

Usar $_GET['email']para parámetros en URL. Úselo $_POST['email']para los datos publicados en el script. O usar _$REQUESTpara ambos. Además, como se mencionó, puede usar la parse_url()función que devuelve todas las partes de la URL. Use una parte llamada 'consulta': allí puede encontrar su parámetro de correo electrónico. Más información: http://php.net/manual/en/function.parse-url.php


55
OP dijo que no está obteniendo URL de address bar. Estas URL son solo cadenas INdel código.
DavChana

7

¿Puedes usar el siguiente código para obtener la dirección de correo electrónico después? en la URL

<?php
if (isset($_GET['email'])) {
    echo $_GET['email'];
}


3
El OP solicitó extraer variables de una cadena, no de la URL en la página actual. parse_url () es la respuesta correcta asumiendo que la cadena está formateada correctamente.
Bloafer

6

Como se mencionó en otra respuesta, la mejor solución es usar

parse_url()

Necesitas usar la combinación de parse_url()y parse_str().

La parse_url()URL de análisis y devuelve sus componentes que puede obtener la cadena de consulta utilizando la queryclave. Entonces deberías usarparse_str() esa cadena de consulta de análisis y devolver los valores a la variable.

$url = "https://example.com/test/1234?basic=2&email=xyz2@test.com";
parse_str(parse_url($url)['query'], $params);
echo $params['email']; // xyz2@test.com

También puedes hacer este trabajo usando expresiones regulares .

preg_match()

Puede usar preg_match()para obtener un valor específico de la cadena de consulta de la URL.

preg_match("/&?email=([^&]+)/", $url, $matches);
echo $matches[1]; // xyz2@test.com

preg_replace()

¡También puede usar preg_replace()para hacer este trabajo en una línea!

$email = preg_replace("/^https?:\/\/.*\?.*email=([^&]+).*$/", "$1", $url);
// xyz2@test.com

3

Creé la función de @Ruel answer . Puedes usar esto:

function get_valueFromStringUrl($url , $parameter_name)
{
    $parts = parse_url($url);
    if(isset($parts['query']))
    {
        parse_str($parts['query'], $query);
        if(isset($query[$parameter_name]))
        {
            return $query[$parameter_name];
        }
        else
        {
            return null;
        }
    }
    else
    {
        return null;
    }
}

Ejemplo:

$url = "https://example.com/test/the-page-here/1234?someurl=key&email=xyz5@test.com";
echo get_valueFromStringUrl($url , "email");

Gracias a @Ruel


1
$uri = $_SERVER["REQUEST_URI"];
$uriArray = explode('/', $uri);
$page_url = $uriArray[1];
$page_url2 = $uriArray[2];
echo $page_url; <- see the value

Esto funciona muy bien para mí usando php


1
¿Puedes por favor tratar de elaborar la respuesta más? Es difícil entender lo que quieres decir con la respuesta anterior.
Mustafa Ehsan Alokozay

1
$web_url = 'http://www.writephponline.com?name=shubham&email=singh@gmail.com';
$query = parse_url($web_url, PHP_URL_QUERY);
parse_str($query, $queryArray);

echo "Name: " . $queryArray['name'];  // Result: shubham
echo "EMail: " . $queryArray['email']; // Result:singh@gmail.com

1

Todavía no se menciona una respuesta mucho más segura que me sorprenda:

filter_input

Entonces, en el caso de la pregunta, puede usar esto para obtener un valor de correo electrónico de los parámetros de obtención de URL:

$email = filter_input( INPUT_GET, 'email', FILTER_SANITIZE_EMAIL );

Para otros tipos de variables, desearía elegir un filtro diferente / apropiado como FILTER_SANITIZE_STRING.

Supongo que esta respuesta hace más que exactamente lo que pide la pregunta: obtener los datos sin procesar del parámetro URL. Pero este es un acceso directo de una línea que es el mismo resultado que este:

$email = $_GET['email'];
$email = filter_var( $email, FILTER_SANITIZE_EMAIL );

También podría adquirir el hábito de tomar variables de esta manera.


whooops, no vi la última línea de las preguntas sobre no obtener esto de la URL ... todavía dejo esto aquí en caso de que sea útil para alguien.
Squarecandy

0

En Laravel, yo uso:

private function getValueFromString(string $string, string $key)
{
    parse_str(parse_url($string, PHP_URL_QUERY), $result);

    return isset($result[$key]) ? $result[$key] : null;
}

0

Función dinámica que analiza la url de cadena y obtiene el valor del parámetro de consulta pasado en la URL

function getParamFromUrl($url,$paramName){
  parse_str(parse_url($url,PHP_URL_QUERY),$op);// fetch query parameters from string and convert to associative array
  return array_key_exists($paramName,$op) ? $op[$paramName] : "Not Found"; // check key is exist in this array
}

Llame a la función para obtener resultados

echo getParamFromUrl('https://google.co.in?name=james&surname=bond','surname'); // bond will be o/p here

-3

Para obtener los parámetros de la cadena URL, utilicé la siguiente función.

var getUrlParameter = function getUrlParameter(sParam) {
    var sPageURL = decodeURIComponent(window.location.search.substring(1)),
        sURLVariables = sPageURL.split('&'),
        sParameterName,
        i;

    for (i = 0; i < sURLVariables.length; i++) {
        sParameterName = sURLVariables[i].split('=');

        if (sParameterName[0] === sParam) {
            return sParameterName[1] === undefined ? true : sParameterName[1];
        }
    }
};
var email = getUrlParameter('email');

Si hay muchas cadenas de URL, puede usar el bucle para obtener el parámetro 'correo electrónico' de todas esas cadenas de URL y almacenarlas en una matriz.


1
No obtengo estas cadenas de la barra de direcciones del navegador, pero usted publicó una solución para ello
Mohammad

OP preguntaba por PHP, no por JavaScript
Jacob Alvarez
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.