2011-05-05 15 views
8

que tienen cadena similar a ésta:Cómo conseguir el partido más largo de expresiones regulares más corto posible en lugar de con preg_match()

{{something1}} something2 {{something3}} something4 

¿Cómo se puede hacer coincidir única "something1" usando la función preg_match()?

me trataron:

preg_match("/\{\{(.*)\}\}/si",$content,$matches); 

pero esto emparejados demasiado, volviendo

something1}} something2 {{something3 

He intentado añadir \b al patrón, pero no conseguir lo que quiero de esa manera tampoco.

¿Podría ayudarme con esto?

+0

que parece una especie de json impropio ¿tienes control sobre la cuerda antes de que te llegue? – mcgrailm

+2

Primera pregunta. Correctamente preguntado. Upvoted. –

Respuesta

19

uso no modificador codiciosos ?:

preg_match("/\{\{(.*?)\}\}/si",$content,$matches); 
      here --^ 
+1

¡Gracias, funciona! "aquí - ^" es megacool) – Narek

0

Prueba esto:

preg_match('|{{([^}]+)}}|si', $content, $matches); 

echo $matches[1]; 
+1

Dado que la "etiqueta" de cierre del OP es un doble '}', puede que se permita un solo '}'. El renuente '. *?' Es más apropiado como sugirió M42, IMO. –

+0

Gracias, pero no funciona :) – Narek

+0

Ambos métodos funcionan igual de bien. Prefiero usar '[^' para ser lo más específico posible. Creo que usar. *? toma más pasos que la expresión regular anterior (aunque no estoy seguro, lo probaré más adelante), aunque la diferencia de rendimiento insignificante simplemente lo lleva a la sintaxis. –

1

una respuesta completa - si nuestra $ var es:

STARTT 
FIRST KKK 
SECOND KKK 

1) En caso usamos :

$var = preg_replace('/STARTT(.*)KKK/', 'REPLACED-STRING', $var); 

que va a cambiar todo, desde la stARTT al último KKK y el resultado será:

REPLACED-STRING 

2) En caso usamos:

$var = preg_replace('/STARTT(.*?)KKK/', 'REPLACED-STRING', $var); 

resultado será:

REPLACED-STRING 
SECOND KKK 
Cuestiones relacionadas