Retire el parámetro específico de la cadena de consulta de la URL

4 minutos de lectura

avatar de usuario de tpow
tpow

Tengo algunos enlaces en una presentación de Powerpoint y, por alguna razón, cuando se hace clic en esos enlaces, se agrega un parámetro de retorno a la URL. Bueno, ese parámetro de retorno está causando que el patrón MVC de mi sitio Joomla se estropee.

¿Cuál es una forma eficiente de eliminar este parámetro de retorno usando PHP?

Ejemplo:
http://mydomain.example/index.php?id=115&Itemid=283&return=aHR0cDovL2NvbW11bml0

  • posible duplicado de Beautiful way para eliminar variables GET con PHP?

    – PiElNúmero

    5 de marzo de 2013 a las 12:17

Avatar de usuario de Marc B
marc b

El método “correcto” más seguro sería:

  1. Analizar la url en una matriz con parse_url()
  2. Extraiga la parte de la consulta, descomponga eso en una matriz usando parse_str()
  3. Elimine los parámetros de consulta que desee unset() ellos de la matriz
  4. Reconstruye la URL original usando http_build_query()

Rápido y sucio es usar una cadena de búsqueda/reemplazo y/o expresión regular para eliminar el valor.

  • mmm raro, mi $parsedurl['query'] es una sola cadena que contiene todos los parámetros

    – ajax333221

    10 de abril de 2014 a las 3:01

  • ejemplo: stackoverflow.com/questions/1251582/…

    – Ari

    1 de septiembre de 2015 a las 1:34

  • ¿Puede dar un ejemplo de escenario en el que fallaría la expresión regular sucia?

    – Vicente

    25 de abril de 2020 a las 5:13

  • Por favor, da un ejemplo.

    – Jones G.

    14 de noviembre de 2020 a las 8:39

  • parse_url() tiene errores. No es seguro usarlo en absoluto.

    – Holden321

    7 ene a las 19:04


Avatar de usuario de Lars Koudal
Lars Koudal

En un hilo diferente, Justin sugiere que la forma más rápida es usar strtok()

 $url = strtok($url, '?');

Vea su respuesta completa con pruebas de velocidad también aquí: https://stackoverflow.com/a/1251650/452515

  • La pregunta era cómo eliminar la variable GET específica return y no eliminar todas las variables GET.

    – mgutt

    17 de enero de 2020 a las 8:57

Avatar de usuario de Sergey Telshevsky
Serguéi Telshevski

esto es para complementar marc bLa respuesta de con un ejemplo, aunque puede parecer bastante larga, es una forma segura de eliminar un parámetro. En este ejemplo eliminamos page_number

<?php
$x = 'http://url.example/search/?location=london&page_number=1';

$parsed = parse_url($x);
$query = $parsed['query'];

parse_str($query, $params);

unset($params['page_number']);
$string = http_build_query($params);
var_dump($string);

  • Gracias Sergey, y gracias @Marc B, excelente ayuda.

    – luke_mclachlan

    6 de marzo de 2015 a las 14:52

  • Comente a cualquiera que se encuentre usando este código que esto solo devuelve la cadena de consulta (menos el parámetro que ha eliminado). Ya no tendrá una URL completa, si eso es lo que desea.

    – Código mono

    15/11/2018 a las 18:00

function removeParam($url, $param) {
    $url = preg_replace('/(&|\?)'.preg_quote($param).'=[^&]*$/', '', $url);
    $url = preg_replace('/(&|\?)'.preg_quote($param).'=[^&]*&/', '$1', $url);
    return $url;
}

Avatar de usuario de NikiC
nikic

parse_str($queryString, $vars);
unset($vars['return']);
$queryString = http_build_query($vars);

parse_str analiza una cadena de consulta, http_build_query crea una cadena de consulta.

Implementación procesal de la respuesta de Marc B después de refinar la respuesta de Sergey Telshevsky.

function strip_param_from_url($url, $param)
{
    $base_url = strtok($url, '?');                   // Get the base URL
    $parsed_url = parse_url($url);                   // Parse it
    if(array_key_exists('query',$parsed_url))        // Only execute if there are parameters
        $query = $parsed_url['query'];               // Get the query string
        parse_str($query, $parameters);              // Convert Parameters into array
        unset($parameters[$param]);                  // Delete the one you want
        $new_query = http_build_query($parameters);  // Rebuilt query string
        $url =$base_url.'?'.$new_query;              // Finally URL is ready
    }
    return $url;            
}

// Usage
echo strip_param_from_url( 'http://url.example/search/?location=london&page_number=1', 'location' )

Avatar de usuario de Aaron Hathaway
aaron hathaway

podrías hacer un preg_replace me gusta:

$new_url = preg_replace('/&?return=[^&]*/', '', $old_url);

  • No es una buena idea si “?return=” no es el último parámetro. Una consulta como “urlerror.com/index.php?return=1&test=abc” se cambiaría a “urlerror.com/index.php&test=abc”

    – kraftb

    18 de noviembre de 2013 a las 13:54

  • preg_replace(‘/return=[^&]?&?/i’, ”, $_SERVIDOR[‘REQUEST_URI’]);

    – Chris Greenwood

    27 mayo 2014 a las 16:32

  • Esta respuesta es incorrecta. Análisis: stackoverflow.com/a/47527628/318765

    – mgutt

    28 de noviembre de 2017 a las 9:33

¿Ha sido útil esta solución?