2010-01-24 12 views
10

¿Cómo puedo reemplazar una subcadena en un patrón encontrado, pero dejando el resto tal como está?php/regex: ¿Cómo reemplazar parte de un patrón encontrado, pero dejando el resto tal como está?

(EDIT: El caso real es por supuesto más complicado que el siguiente ejemplo, que tiene que coincidir con las ocurrencias dentro de las etiquetas XML que es por eso que tengo que usar expresiones regulares.!)

Digamos que quiero cambiar ocurrencias de la letra "X" dentro de una palabra a la letra "Z".

Quiero

aaXaa AAX Xaa

para convertirse en

aaZaa Aaz Zaa

Encontrar ocurrencias de palabras como "x" no es una problema, como este:

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

sino un preg_match normales reemplaza el partido completo, donde quiero nada en el patrón excepto "X" para alojarse, ya que es .

¿Cuál es la mejor manera de lograr esto en php?

+0

Su expresión regular no coincidiría con la X al final de la segunda palabra. – soulmerge

+0

Estoy confundido, ¿no es un simple reemplazo hacer exactamente lo que preguntas? Reemplazar el patrón coincidente y dejar el resto tal como está. –

+0

Lo siento por cunfusing. Tengo que usar expresiones regulares, ¡mi ejemplo fue un poco simplificado! – Cambiata

Respuesta

13

Si su expresión regular solo coincide con la parte relevante, no debería ser un problema que reemplace la coincidencia completa (como preg_replace('/X/', 'Z', $string)).

Pero si usted necesita la expresión regular para contener partes que no deben ser reemplazados, es necesario capturarlos e inserte de nuevo:

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

¡Gracias, Soulmerge! ¡Exactamente lo que necesitaba! – Cambiata

+0

Encontré al concatenar una variable de cadena entre los dos grupos coincidentes que tuve que poner los números entre llaves, como este ''$ {1}'. $ foo. '$ {2}' ', de lo contrario no funcionó. ¿Porqué es eso? – Nate

1

Prueba este

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

El resultado del ejemplo sería :

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

Debe ordenar las matrices antes de llamar a preg_replace, de modo que los patrones correctos sean sustituidos por los valores correctos: ksort ($ patterns); ksort ($ reemplazos); –

2

Si es realmente tan simple como reemplazar X ingenio h Z, también se puede utilizar str_replace(), que es más rápido que usar preg en este caso:

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

Entiendo tu punto, y el caso real es, por supuesto, más complicado. Lo usaré para manejar etiquetas de espacios de nombres en documentos xml, ¡así que tiene que haber expresiones regulares para esto! – Cambiata

0

¿Usted realmente tiene que usar expresiones regulares para esto?

$output = str_replace('X', 'Z', $input); 
Cuestiones relacionadas