¿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/[email protected]
https://example.com/test/1234?basic=2&[email protected]
https://example.com/test/[email protected]
https://example.com/test/[email protected]&testin=123
https://example.com/test/the-page-here/1234?someurl=key&[email protected]

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.

Asim Zaidi
fuente
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

Ruel
fuente
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.

hjpotter92
fuente
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://[email protected] $email = $_GET['email']; $email === '[email protected]';
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/[email protected]&testin=123";
$query_str = parse_url($url, PHP_URL_QUERY);
parse_str($query_str, $query_params);
print_r($query_params);

//Output: Array ( [email] => [email protected] [testin] => 123 ) 
JCotton
fuente
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

Paul Denisevich
fuente
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'];
}

Gulshan kumar
fuente
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 protected]";
parse_str(parse_url($url)['query'], $params);
echo $params['email']; // [email protected]

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]; // [email protected]

preg_replace()

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

$email = preg_replace("/^https?:\/\/.*\?.*email=([^&]+).*$/", "$1", $url);
// [email protected]
Mohammad
fuente
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 protected]";
echo get_valueFromStringUrl($url , "email");

Gracias a @Ruel

mghhgm
fuente
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

Asesha George
fuente
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 protected]';
$query = parse_url($web_url, PHP_URL_QUERY);
parse_str($query, $queryArray);

echo "Name: " . $queryArray['name'];  // Result: shubham
echo "EMail: " . $queryArray['email']; // Result:[email protected]
SHUBHAM SINGH
fuente
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.

Squarecandy
fuente
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;
}
Ronald Araújo
fuente
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
Bhargav Kaklotara
fuente
-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.

Ravi Agrawal
fuente
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