Elimina un parámetro específico de la URL conservando otros parámetros

Quiero eliminar un parámetro de una URL:

$linkExample1='https://stackoverflow.com/?name=alaa&counter=1';
$linkExample2='https://stackoverflow.com/?counter=4&star=5';

Estoy tratando de obtener este resultado:

Estoy tratando de hacerlo usando preg_replace, pero no tengo ni idea de cómo se puede hacer.

preguntado el 11 de junio de 12 a las 19:06

prueba y usa la función parse_url(). Divide la URL en partes para que pueda verificarla y modificarla. -

8 Respuestas

$link = preg_replace('~(\?|&)counter=[^&]*~','$1',$link);

Respondido el 12 de junio de 12 a las 13:06

Gracias Crayon pero recibí este error Advertencia: preg_replace() [function.preg-replace]: Error de compilación: paréntesis no coincidentes en el desplazamiento 19 en C:\AppServ\www\pa.php en la línea 6 - Alaa Gamal

Muchas gracias, pero ¿puedo eliminar el & antes o después del valor? - Alaa Gamal

técnicamente, su pregunta y el resultado del ejemplo lo solicitaron. Pero para su información, está bien dejarlos allí. Pero si, no obstante, quiere algo "más limpio", le sugiero que mire las respuestas que involucran parse_url y http_build_query en lugar de - Crayon violento

El problema es que estoy usando una reescritura de URL y no puedo usar http_build_query. Su función funciona bien ahora. Gracias de nuevo. Alaa Gamal

¡Esto funciona para mí! Después del preg_replace que usé $link = rtrim($link, '?&'); para eliminar el último signo del enlace, si es un "?" o un "&". :) - ReynekeVosz

Confiar en expresiones regulares puede arruinar las cosas a veces.

Debes usar, el parse_url() función que divide la URL completa y se la presenta como una matriz asociativa.

Una vez que tenga esa matriz, puede editarla como desee y eliminar parámetros.

Una vez completado, utilice el http_build_url() función para reconstruir la URL con los cambios realizados.

Consulta los documentos aquí..

Parse_Url Http_build_query()

EDITAR

Vaya, se me olvidó mencionar. Después de obtener la cadena de parámetros, obviamente necesitará separar los parámetros como parámetros individuales. Para esto, puede proporcionar la cadena como entrada al parse_str () función.

Incluso puede utilizar explotar() con & como delimitador para hacer esto.

Respondido el 11 de junio de 12 a las 19:06

Afaik, la única vez que fallaría es si la URL estuviera mal formada para empezar. Si ese es el caso, esas funciones integradas también fallarían. GIGO. - Crayon violento

acordado. en casos extremos, entonces, sería mejor dividir la cadena de URL en el signo '=' y dividir la segunda parte usando explotar usando el delimitador & - arijeet

Recomendaría usar una combinación de parse_url () y http_build_query ().

Respondido el 11 de junio de 12 a las 19:06

¡sí! parece más limpio que regex para esto. - Jeremy Holovacs

después de analizar la url, usando parse_url(), obtuve estos resultados. Alaa Gamal

en realidad necesitas usar parse_url() para obtener la cadena de consulta, entonces parse_str() para poner los parámetros de cadena de consulta en una matriz, luego verifique y elimine el índice de parámetro de URL si existe, y luego http_build_query() para reconstruir la cadena de consulta - Crayon violento

siempre puede usar la función de explosión en esta cadena y poner el delimitador como '&'. Esto le dará todos los parámetros como una matriz. - arijeet

mis URL se ven así //link.com/category/something/page/1.html y no puedo reconstruir el enlace de nuevo... es tan difícil - Alaa Gamal

Un ejemplo de código de cómo tomaría una URL solicitada y eliminaría un parámetro llamado "nombre", luego volvería a cargar la página:

$url = $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; //complete url
$parts = parse_url($url);
parse_str($parts['query'], $query); //grab the query part
unset($query['name']); //remove a parameter from query
$dest_query = http_build_query($query); //rebuild new query
$dest_url=(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http").'://'.$parts['path'].'?'.$dest_query; //add query to host
header("Location: ".$dest_url); //reload page

Respondido el 06 de Septiembre de 18 a las 08:09

parse_url() y parse_str() tienen errores Las expresiones regulares pueden funcionar pero tienden a romperse. Si desea deconstruir correctamente, realizar cambios y luego reconstruir una URL, debe consultar:

http://barebonescms.com/documentation/ultimate_web_scraper_toolkit/

ExtractURL() genera parse_url()-como salida pero hace mucho más (y lo hace bien). CondenseURL() toma una matriz de ExtractURL() y construye una nueva URL a partir de la información. Ambas funciones están en el archivo 'support/http.php'.

Respondido el 12 de junio de 12 a las 07:06

Años después... $ _GET se puede manipular como cualquier otra matriz en PHP. Simplemente desarmado la clave y crear la consulta http usando el http_build_query función.

// Populate _GET with sample data...
$_GET = array(
    'value_a' => "A",
    'key_to_remove' => "Don't delete me bro!",
    'value_b' => "B"
);
// Should output everything...
// "value_a=A&key_to_remove=Don%27t+delete+me+bro%21&value_b=B"
echo "\n".http_build_query( $_GET );

// Remove the key from _GET...
unset( $_GET[ 'key_to_remove' ] );
// Should output everything else...
// "value_a=A&value_b=B"
echo "\n".http_build_query( $_GET );

Respondido 02 ago 17, 20:08

Esto es trabajo para mí:

function removeParameterFromUrl($url, $key)
{
    $parsed = parse_url($url);
    $path = $parsed['path'];
    unset($_GET[$key]);
    if(!empty(http_build_query($_GET))){
      return $path .'?'. http_build_query($_GET);
    } else return $path;
}

respondido 16 nov., 17:02

Está analizando $url, pero luego usa $_GET en su lugar... ¿está seguro de que funciona para usted? - Nuno

¡Manéjalo correctamente! !

remove_query('http://example.com/?a=valueWith**&**inside&b=value');

Código:

function remove_query($url, $which_argument=false){ 
    return preg_replace( '/'. ($which_argument ? '(\&|)'.$which_argument.'(\=(.*?)((?=&(?!amp\;))|$)|(.*?)\b)' : '(\?.*)').'/i' , '', $url);  
}

respondido 29 nov., 17:11

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.