2010-05-22 3 views
12

Vous avez cette fonction pour ammending la chaîne de requête et je me demandais ce que signifiait la partie de remplacement du pre_replace (ie $ 1 $ 2 $ 4).

function add_querystring_var($url, $key, $value) { 
$url = preg_replace('/(.*)(\?|&)' . $key . '=[^&]+?(&)(.*)/i', '$1$2$4', $url . '&'); 
$url = substr($url, 0, -1); 
if (strpos($url, '?') === false) { 
    return ($url . '?' . $key . '=' . $value); 
} else { 
    return ($url . '&' . $key . '=' . $value); 
} 
} 

Pas trop familier avec l'expression régulière. Je reçois les différentes parties de preg_replace mais pas 100% sur l'utilisation de '$ 1 $ 2 $ 4' dans la pièce de rechange.

Répondre

17

$1, $2... $n dans les expressions régulières remplace les références aux correspondances enveloppées entre parenthèses. $0 serait le match, $1 serait la première capture parenthésée, $2 serait le deuxième, etc.

  • $1 est une référence à tout ce qui est compensée par la première (.*)
  • $2 est une référence à (\?|&)
  • $4 est une référence à la deuxième (.*)

Voir the docs, en particulier le remplacement l'argument de la fonction:

remplacement peut contenir des références de la forme \ n ou (depuis PHP 4.0.4) $ n, cette dernière forme étant celle préférée. Chaque référence sera remplacée par le texte capturé par le nième motif parenthèse. n peut être compris entre 0 et 99, et \ 0 ou 0 correspond au texte correspondant à l'ensemble du modèle. Les parenthèses ouvrantes sont comptées de gauche à droite (à partir de 1) pour obtenir le numéro du sous-masque de capture. Pour utiliser le backslash en remplacement, il doit être doublé ("\\" PHP string).

+0

cela fait beaucoup plus de sens maintenant. Donc, preg_replace va essentiellement supprimer la correspondance $ key de $ url. – Taylor

1

Les sont des espaces pour chaque partie de regex entre parenthèses, ils remplacent la partie spécifiée dans regex.

5

Perl remplacement d'expression régulière utilise des variables de correspondance qui sont les parties à l'intérieur des parenthèses dans l'expression régulière:

$1 $2      $3 $4 
'/(.*)(\?|&)' . $key . '=[^&]+?(&)(.*)/i' 

Ainsi, se référant à $1 dans la chaîne de remplacement remplacera ce qui a été adapté au premier parenthèses. $0 se référera cependant à toute la chaîne correspondante.

Vous pouvez même faire correspondre les sous-ensembles entre parenthèses à l'intérieur de l'expression régulière elle-même en utilisant une barre oblique inverse au lieu d'un signe dollar. Par exemple, si vous voulez remplacer les mots doublés "le", ou "et":

preg_replace('/\b(the|and)\b\s*\1/', '$1', $sentence); 
+3

+1 pour la représentation diagrammatique. – BoltClock

+0

merci, c'était très utile aussi. J'aimerais pouvoir choisir deux réponses! – Taylor

Questions connexes