2014-04-11 282 views
1

我有我的自定義標籤,例如。PHP preg_match_all:括號內的括號標籤

{{tag-name}} 
<table> 
    <tr> 
    {{loop}}<td>text</td> ... {{/loop}} 
    </tr> 
</table> 
{{/tag-name}} 

我想提取括號內的HTML代碼。

我preg_match_all使用這個模式:

/{\{.*?\}\}((?:(?!\{\{/(.*?)\}\}).)*)\{\{\/.*?\}\}/s 

,但它不工作。我怎樣才能解決這個問題?

+2

提取的文本應該是什麼樣子? – sshashank124

+0

你想在匹配內容後執行替換嗎?我問,因爲如果是的話,這種做法可能會有所不同。 –

+1

**「不起作用」是什麼意思?**「不起作用」是我們理解問題的不充分說明。當你嘗試時發生了什麼?你收到錯誤信息了嗎?你得到不正確的結果了嗎?你有沒有得到結果?如果結果不正確,是什麼使它們不正確?你想要什麼呢?你有沒有得到任何正確的結果?如果是這樣,他們是什麼?不要讓我們猜測。 –

回答

0

得到你父親的標籤preg_match_all和"/\{\{.[^\}]+\}\}(.+)\{\{\/.+\}\}/s"正則表達式; 問題是你的標籤內的另一個標籤。

看的DomDocument在http://php.net/manual/en/class.domdocument.php是容易加載您的文檔,進去的文件標籤和標籤內容,用一個簡單的方法調用...

1

如果{{tag-name}}不是任意嵌套的,這個正則表達式應該這樣做:

$pattern = '~{{([^}]+)}}(.*?){{/\1}}~s'; 

See on regex101.com

捕獲在第一parenthesised組{{([^}]+)}}的標籤名稱和端匹配{{/\1}}

捕獲的第二parenthesised組(.*?)的比賽將在$out[2]

使用s (PCRE_DOTALL)modifier*?lazy quantifier。如果需要的話


使用帶preg_matchpreg_match_all,例如

if(preg_match_all($pattern, $input, $out)) { 
    var_dump($out); 
} 

請參閱eval.in for an example