// Vous lisez...

PHP

Regex pour supprimer un paramètre GET d’une URL

 Symptômes

En passant en GET un paramètre qui a déjà été passé précédemment, on multiplie dans l’URL le nombre d’occurrences. Exemple :

 Idée

On utilise une expression régulière placée dans une fonction qu’on appelle avant d’écrire l’URL propre :

  1. <?php
  2. class utils {
  3.     /**
  4.      * supprimer des paramètres d'une URL
  5.      *
  6.      * @param <array|string> $parametres clé(s) à supprimer
  7.      * @param <string> $url
  8.      * @return <string>
  9.      */
  10.     public function delget($parametres, $url = null) {
  11.         $url = !$url ? url::current().'?'.$_SERVER['QUERY_STRING'] : $url;
  12.         if (is_array($parametres)) {
  13.             foreach($parametres as $parametre) {
  14.                 $url = preg_replace('/&'.$parametre.'(=[^&]*)?|^'.$parametre.'(=[^&]*)?&?/', '', $url);
  15.             }
  16.         } else {
  17.             $url = preg_replace('/&'.$parametres.'(=[^&]*)?|^'.$parametres.'(=[^&]*)?&?/', '', $url);
  18.         }
  19.         return $url;
  20.     }
  21. }
  22. ?>

Puis pour l’appeler :

  1. <a href="<?php echo url::base().utils::delget('since'); ?>&since=<?php echo $k; ?>"><?php echo $v; ?></a>

 Résultat

« Des URLs toujours propres avec Ashorlivs ! »

 À noter

Manuel Jinsi me fait remarquer l’emploi de la méthode url ::current ; il s’agit d’un helper du framework Kohana. Hors de ce framework, on utilisera : $_SERVER[’REQUEST_URI’] pour récupérer cette information (voir la liste des variables prédéfinies).

Il faut aussi prendre en compte le fait que dans Kohana, pour les versions 2.x, la méthode current du helper url permet de récupérer l’URL courante avec ou sans la querystring GET, cf le manuel : helpers:url Kohana Users Guide.

 Plusieurs paramètres à supprimer

Il arrive qu’on ait plusieurs paramètres à supprimer, par exemple :

Ici on fait du tri, couplé avec since, et on veut pouvoir changer le sort (tri) et le dir (direction) sans toucher au since, sans que sort et dir ne se répètent dans l’URL. On passe donc un array :

  1. <a href="<?php echo url::base().utils::delget(array('sort','dir')); ?>&sort=note&dir=<?php echo $dir; ?>">Note</a>

Voilà. De rien.

Répondre à cet article

Commentaires

1 Message

  1. Regex pour supprimer un paramètre GET d’une URL

    Ah mais si, merci, quand même, j’insiste... Quelques lignes de code bien utiles qui fonctionnent parfaitement.

    | 5 janvier 2012, 21:37

    Répondre à ce message