2011-02-04 7 views
17

Estoy tratando de usar una expresión regular para borrar solo la parte coincidente de una cadena. Estoy usando la función preg_replace y he tratado de eliminar el texto correspondiente poniendo paréntesis alrededor de la parte correspondiente. Ejemplo:

preg_replace('/text1(text2)text3/is','',$html); 

Esto reemplaza toda la cadena con '' embargo. Solo quiero borrar text2, pero dejo text1 y text3 intactos. ¿Cómo puedo unir y reemplazar solo la parte de la cadena que coincide?

Respuesta

8

Prueba esto:

$text = preg_replace("'(text1)text2(text3)'is", "$1$2", $text); 

espero que funcione!

Editar: cambió \\1\\2 a $1$2 que es la forma recomendada.

+3

Utilice $ n en lugar de \\ n. – NikiC

+0

@NikiC ¿es solo estilo o tiene alguna razón detrás? – aorcsik

+1

El uso de $ n sobre \\ n es la recomendación oficial, citando el manual: "[...] puede contener referencias de la forma \\ n o (desde PHP 4.0.4) $ n, siendo esta última la preferido ". No sé el razonamiento exacto detrás de esto, pero la sintaxis $ es al menos a) más legible yb) también tiene soporte para $ {n}. Tal vez hay razones adicionales. – NikiC

26

Use backreferences (es decir, corchetes) para guardar solo las partes de la expresión que desea recordar. Es posible recuperar el contenido de la cadena de reemplazo mediante el uso de $1, $2, etc .:

preg_replace('/(text1)text2(text3)/is','$1$2',$html); 
-4

La forma más sencilla se ha mencionado varios tipos. Otra idea es lookahead/lookback, esta vez son exagerados pero a menudo bastante útiles.

33

Existe una alternativa al uso de text1 y text3 en el patrón de coincidencia y luego volver a colocarlos a través de la cadena de reemplazo. Puede utilizar afirmaciones como esta:

preg_replace('/(?<=text1)(text2)(?=text3)/', "", $txt); 

De esta manera la expresión regular se ve sólo por la presencia , pero no toma las dos cadenas en cuenta al aplicar la sustitución.

http://www.regular-expressions.info/lookaround.html para obtener más información.

+0

Esto es genial, ¡no sabía que podrías hacer esto! +1 –

+0

+1 Este es el método adecuado. – Xeoncross

+1

Las referencias inversas pueden ser preferibles si su patrón lookbehind no produce una coincidencia de longitud fija – leo

Cuestiones relacionadas