2010-05-22 20 views
12

Ottenuto questa funzione per ammendare la stringa di query e si chiedeva quale fosse la parte di sostituzione del pre_replace (cioè - $ 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); 
} 
} 

Non troppo familiare con le espressioni regolari. Ottengo le varie parti per preg_replace ma non al 100% circa l'uso di '$ 1 $ 2 $ 4' nella parte di ricambio.

risposta

17

$1, $2... $n in espressioni regolari sostituisce sono riferimenti alle corrispondenze racchiuse tra parentesi. $0 sarebbe l'intera partita, $1 sarebbe la prima cattura parentesi, $2 sarebbe il secondo, ecc

  • $1 è un riferimento a ciò corrisponde la prima (.*)
  • $2 è un riferimento ad (\?|&)
  • $4 è un riferimento al secondo (.*)

Vedi the docs, in particolare la sostituzione argomento della funzione:

sostituzione possono contenere riferimenti nella forma \ n o (da PHP 4.0.4) $ n, con quest'ultima forma essendo il preferito. Ogni riferimento di questo tipo sarà sostituito dal testo catturato dall'ennesimo modello parentesi. n può essere compreso tra 0 e 99 e \ 0 o $ 0 si riferisce al testo corrispondente all'intero modello. Le parentesi di apertura vengono contate da sinistra a destra (a partire da 1) per ottenere il numero del subpattern di cattura. Per utilizzare la barra rovesciata in sostituzione, è necessario raddoppiarla (stringa \\ "PHP").

+0

che ora ha molto più senso. In modo che preg_replace rimuoverà fondamentalmente la corrispondenza $ chiave da $ url. – Taylor

1

Sono segnaposto per ciascuna parte di regex racchiusa tra parentesi, sostituiscono la parte specificata in regex.

5

Perl sostituzione espressione regolare utilizza variabili coi che sono le parti all'interno di parentesi nell'espressione regolare:

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

Quindi, facendo riferimento alla $1 nella stringa di sostituzione sostituirà ciò che è stato abbinato al primo parentesi. $0 tuttavia farà riferimento all'intera stringa corrispondente.

È anche possibile associare i sottoinsiemi parentetici all'interno dell'espressione regolare stessa utilizzando una barra rovesciata anziché un segno di dollaro. Ad esempio, se si desidera sostituire le parole doppie "il", o "e":

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

+1 per la rappresentazione schematica. – BoltClock

+0

grazie, anche questo è stato molto utile. Vorrei poter scegliere due risposte! – Taylor