2010-01-24 6 views
10

Come posso sostituire una sottostringa in uno schema trovato, ma lasciando il resto così com'è?php/regex: come sostituire parte di un modello trovato, ma lasciando il resto così com'è?

(EDIT: Il caso reale è naturalmente più complicato di nell'esempio qui sotto, devo abbinare occorrenze all'interno di tag XML Ecco perché devo usare espressioni regolari.!)

Diciamo che voglio cambiare le occorrenze di la lettera "X" all'interno di una parola alla lettera "Z".

voglio

aaXaa AAX Xaa

per diventare

aaZaa AAZ Zaa

Trovare occorrenze di parole tra cui "x" non è un problema, come questo:

[^ X \ s] X [^ \ s]

ma un preg_match normale sostituisce la corrispondenza completa, dove voglio nulla nel modello ad eccezione di "X" per rimanere così com'è .

Quale è il modo migliore per farlo in php?

+0

L'espressione regolare non corrisponde alla X alla fine della seconda parola. – soulmerge

+0

Sono confuso, non una semplice sostituzione fa esattamente quello che chiedi? Sostituendo il modello corrispondente e lasciando il resto così com'è. –

+0

Ci scusiamo per il cunfusing. Devo regex utente, il mio esempio è stato un po 'troppo semplificato! – Cambiata

risposta

13

Se l'espressione regolare corrisponde solo alla parte pertinente, non dovrebbe esserci alcun problema che sostituisca la corrispondenza completa (come preg_replace('/X/', 'Z', $string)).

Ma se avete bisogno l'espressione regolare per contenere parti che non dovrebbero essere sostituiti, è necessario catturarli e inserirli di nuovo:

preg_replace('/(non-replace)X(restofregex)/', '$1Z$2', $string); 
+0

Grazie, Soulmerge! Esattamente quello di cui avevo bisogno! – Cambiata

+0

Ho trovato quando concatenare una variabile stringa tra i due gruppi corrispondenti ho dovuto mettere i numeri tra parentesi graffe, come questo '$ {1}'. $ pippo '$ {2}' ', altrimenti non ha funzionato. Perché? – Nate

1

Prova questo

<?php 
$string = 'The quick brown fox jumped over the lazy dog.'; 
$patterns[0] = '/quick/'; 
$patterns[1] = '/brown/'; 
$patterns[2] = '/fox/'; 
$replacements[2] = 'bear'; 
$replacements[1] = 'black'; 
$replacements[0] = 'slow'; 
echo preg_replace($patterns, $replacements, $string); 
?> 

Il precedente esempio visualizzerà :

The bear black slow jumped over the lazy dog. 
+0

Devi ksortare gli array prima di chiamare preg_replace, in modo che i modelli corretti vengano sostituiti dai valori corretti: ksort ($ patterns); ksort ($ sostituzioni); –

2

Se è davvero semplice come sostituire lo spirito X h Z, è anche possibile utilizzare str_replace(), che è più veloce rispetto all'utilizzo preg in questo caso:

$sNew = str_replace("X", "Z", $sOld); 
+0

Ho capito il tuo punto, e il caso reale è ovviamente più complicato. Lo userò per gestire i tag namespace in xml-documents, quindi ci deve essere una regex reale per questo! – Cambiata

0

Hai davvero usare regex per questo?

$output = str_replace('X', 'Z', $input); 
Problemi correlati