2010-10-22 47 views
12

我想捕獲<%和%>之間的所有文本&塊。正則表達式將捕獲包括多行塊在內的兩個字符之間的所有內容

例如:

<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> 

我已經試過\<\%(.*)\%\>但將捕獲的一切,包括<h1>Test Template</h1>塊爲好。

+2

請[不要用正則表達式解析HTML](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags)! – 2010-10-22 21:29:41

回答

34

您正在使用哪種正則表達式引擎?

<%(.*?)%> 

應該啓用「點匹配換行符」選項。如果你不知道如何設置,嘗試

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

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

無需逃避<%,或>的方式。

2

我一直在使用微軟的Regex引擎(由IE中的JScript提供),它有一個影響.行爲的'多行'開關,但是我仍然遇到了問題,我不得不使用[\u0000-\uFFFF]它匹配一切包括EOL或任何控制字符...

所以有<%([\u0000-\uFFFF]*?)%>

+0

多行('m')修飾符不會影響'.'的行爲。這是單行(DOTALL,'s')修飾符,但JavaScript不支持它。正如@Tim在他的答案中所表明的,在JavaScript中匹配任何東西(包括換行符)最常見的成語是'[\ s \ S]'。 – 2010-10-23 01:12:06

6

\<\%(.*?)\%\>一去。你需要使用.*?來獲得非貪婪的模式匹配。

編輯要解決多行問題,您不能使用.通配符,因爲它匹配除了換行符之外的所有內容。該選項因正則表達式引擎而異。所以,如果你告訴我你的正則表達式引擎,我可以告訴你該怎麼做。

+0

一些正則表達式引擎採用'\ <'作爲__ginning的word_和'\>'作爲__nd的字_ – 2010-10-22 20:05:29

+0

@Stijn:在這種情況下,您可以轉義\ < and \> – 2010-10-22 20:12:21

相關問題