2009-11-13 19 views
5

Esto debería ser simple, pero soy novato y no puedo por la vida de mi entenderlo. Estoy tratando de utilizar expresiones regulares para que coincida con el texto dentro de las etiquetas especiales de apertura/cierre: [p2] [/ p2]php regex: lookbehind y lookahead y problema de codicia

Así que en este texto:

apple [p2]banana[/p2] grape [p2]lemon[/p2] 

que debe coincidir con "banana" y "limón ". La expresión regular que he trabajado hasta ahora es:

(?<=\[p2\]).+(?=\[\/p2\]) 

Pero esto es demasiado codicioso. Combina comenzando con la "b" en banana y termina con la "n" en limón, haciendo coincidir banana [/ p2] grape [p2] lemon. ¿Cómo puedo unir plátano y limón?

+1

por supuesto, tan pronto como publique esto creo que finalmente lo descubrí: (? <= \\ [p2 \\]). +? (? = \\ [\/p2 \\]) ¿verdad? –

+0

De hecho. Tienes razón. – Franz

Respuesta

5

Esto debe hacerlo:

(?<=\[p2\]).+?(?=\[\/p2\]) 

que añade el signo de interrogación para hacer que el cuantificador no expansivo.

+0

gracias por la respuesta –

+1

Alternativamente, puede especificar el modificador 'U' para indicar que todos los cuantificadores en el patrón deben considerarse no codiciosos, p. Ej. 'preg_match ('/ (? <= \ [p2 \]). + (? = \ [\/p2 \])/U', ....' Observe que el carácter ** capital ** 'U' ​​automáticamente convierta el signo '+' en no codicioso, y un '' '(operador de avaricia) provocará que muestre el comportamiento que está describiendo. Vale la pena saberlo Ver: http://us2.php.net/manual /en/reference.pcre.pattern.modifiers.php – Dereleased

+0

@Dereleased: No entiendo muy bien. ¿Cuál es exactamente la diferencia? Gracias por el comentario, sin embargo. – Franz

0

En lugar de usar un modificador de expresiones regulares, puede usar el modificador de coincidencia de estilo perl estándar y agregar un? después de + o * para decirle a esa porción específica que no sea codicioso. Mencionado arriba, pero la especificidad puede ayudar.