2010-10-22 11 views
12

Quiero capturar todos los bloques de texto & entre <% y%>.Expresión RegEx que capturará todo entre dos caracteres, incluidos los bloques de líneas múltiples

Por ejemplo:

<html> 
<head> 
<title>Title Here</title> 
</head> 
<body> 
<% include("/path/to/include") %> 
<h1>Test Template</h1> 
<p>Variable: <% print(second_var) %></p> 
<% 

variable = value; 

foreach(params here) 
{ 
    code here 
} 

%> 
<p><a href="/" title="Home">Home</a></p> 
</body> 
</html> 

He tratado \<\%(.*)\%\> pero que capturará todo, incluyendo <h1>Test Template</h1> bloque también.

+2

Por favor, [no analizar HTML con expresiones regulares] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags)! –

Respuesta

34

¿Qué motor regex estás utilizando?

<%(.*?)%> 

debería funcionar con la opción "dot coincide con la nueva línea" habilitada. Si no sabe cómo configurar eso, tratar

<%([\s\S]*?)%> 

o

(?s)<%(.*?)%> 

No hay necesidad de escapar <, % o > por cierto.

2

He estado usando el motor Regex de Microsoft (provisto por JScript en IE) y tiene un interruptor de 'multilínea' que afecta el comportamiento de ., pero aún así tuve problemas para resolver usando [\u0000-\uFFFF] que coincide con todo lo incluyendo RFL de caracteres de control o cualquier ...

Así que tienen un ir con <%([\u0000-\uFFFF]*?)%>

+0

El modificador multiline ('m') no afecta el comportamiento de' .'. Es el modificador de línea única (DOTALL, 's') que hace eso, pero JavaScript no lo admite. La expresión más común para hacer coincidir cualquier cosa, incluidas las líneas nuevas en JavaScript es '[\ s \ S]', como @Tim demostró en su respuesta. –

6

\<\%(.*?)\%\>. Debe usar .*? para obtener una coincidencia de patrón no codicioso.

EDIT Para resolver el problema de las líneas múltiples, no puede usar el comodín ., ya que coincide con todo excepto con la nueva línea. Esta opción difiere según el motor de expresiones regulares. Entonces, puedo decirte qué hacer si me dices tu motor de expresiones regulares.

+0

algún motor de expresiones regulares toma '\ <' para _beginning de word_ y '\>' para _end de word_ –

+0

@Stijn: en ese caso, puede escaparse \ < and \> –

Cuestiones relacionadas