RegEx:individuazione e sostituzione di ABC in “AB ABC D”
-
22-08-2019 - |
Domanda
Ho bisogno di un consiglio su questo snippet
$text = preg_replace('|(A.*)?A(.*)C|', '$1foo$2bar', $text);
Questo match ABC in "AB ABC D" e sostituirlo con "AB fooBbar D";come si può vedere questo corrisponde a "AB ", iniziando così, che devo ripetere la stringa di sostituzione con $1, al fine di non perdere.
È questo il modo migliore per ottenere un tale risultato?
C'è una bandiera X tale che
$text = preg_replace('|A(.*)C|X', 'foo$1bar', $text);
produce lo stesso risultato?
Spero di essere stata chiara
Grazie!
MODIFICA:Considerare di A,B,C atomic stringhe di caratteri arbitrari, possono contenere spazi bianchi e
Inoltre, l'esempio presentato è, infatti, buggy, come si corrisponde solo il secondo "ABC" a "ABC ABC".
EDIT2:Mi dispiace, probabilmente ho spiegato il problema, molto male.Il punto è che vorrei partita qualunque cosa è tra i due Una,C string, in modo che non c'è Una sottostringa in una partita
Di nuovo grazie
Soluzione
La questione è stata chiarita, provare questa espressione:
preg_replace('/(?:A)+(.+?)(?:C)+/', 'foo$1bar', $text)
Un esempio:
$A = 'abc'; $B = '123'; $C = 'xyz';
$text = "$A$B$C $A$A$B$C $A$B$C$C";
echo preg_replace("/(?:$A)+(.+?)(?:$C)+/", 'foo$1bar', $text);
Altri suggerimenti
Che ne dici di questo:
$text = preg_replace('|A(\S*)C|', 'foo$1bar', $text);
Il \S
indica un carattere di spazio, quindi non sostituisce in parole diverse.
Dopo aver visto alcune delle OP commenti, sarò in pericolo un'altra ipotesi:
$text = preg_replace('|A(B)C|', 'foo$1bar', $text);
Utilizzare il non-golosa versione del *
quantificatore :
$text = preg_replace('|(.*)(A.*?C)|', '$1foo$2bar', $text);