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

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top