Pregunta

Necesito consejo sobre este fragmento

$text = preg_replace('|(A.*)?A(.*)C|', '$1foo$2bar', $text);

Esto corresponderá con ABC en "AB ABC D", y sustituirla por "AB fooBbar D"; como se puede ver esto coincide con la parte "AB" al principio, así que tengo que repetir en la cadena de reemplazo con $ 1, con el fin de no perderlo.

Es ésta la mejor manera de conseguir tal resultado?

¿Hay una bandera X tal que

$text = preg_replace('|A(.*)C|X', 'foo$1bar', $text); 

produce el mismo resultado?

Espero haber sido claro

Gracias!

editar : Considere A, B, C como cadenas atómicas de caracteres arbitrarios, que pueden contener espacios en blanco, así

Además, el ejemplo que se presenta es, de hecho, con errores, ya que coincide con el segundo "ABC" en "ABC ABC".

Edit2 : Lo siento, probablemente he explicado el problema muy mal. El punto es que me gustaría que coincida con lo es entre dos cuerdas A, C, por lo que no hay subcadena A en el partido

Una vez más gracias

¿Fue útil?

Solución

A medida que la cuestión ha sido aclarada, trate de esta expresión:

preg_replace('/(?:A)+(.+?)(?:C)+/', 'foo$1bar', $text)

Un ejemplo:

$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);

Otros consejos

¿Qué tal esto:

$text = preg_replace('|A(\S*)C|', 'foo$1bar', $text);

El \S coincide con un carácter no está en blanco, por lo que no reemplazará a través de diferentes palabras.


Después de ver algunos de los comentarios de la OP, voy a aventurar otra conjetura:

$text = preg_replace('|A(B)C|', 'foo$1bar', $text);

Utilice la versión no expansivo del cuantificador *:

$text = preg_replace('|(.*)(A.*?C)|', '$1foo$2bar', $text);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top