2012-12-23 132 views
0

我的文字是這樣的:PHP preg_match_all匹配最接近的值

[if-abc]content of abc[/if] [if-def]content of def[/if] 

我想匹配:

[if-abc]content of abc[/if] and then [if-def]content of def[/if] 

,但我目前的功能整個事情相匹配。我怎樣才能使它所以它的閉合[/如果]標籤

$m = null; 
preg_match_all('/\[if-([a-z-]*)\](.*)\[\/if\]/', $source, $m); 

這工作的,當多個條件都存在在同一行上,除了第一次出現匹配。

+0

正則表達式不是此任務的正確工具。改爲解析文本。 – KingCrunch

+0

它似乎工作得很好,什麼是我應該解析的原因? – nick

+0

因爲遲早你會面臨問題,你不能很容易地解決問題,特別是因爲你會忘記事情並引入安全問題。這是相同的原因,爲什麼在HTML上應用正則表達式是一個壞主意(等等))。 – KingCrunch

回答

3

讓你的明星量詞non-greedy與...

preg_match_all('/\[if-([a-z-]*)\](.*?)\[\/if\]/', $source, $m); 

這樣的.*結構將開始從匹配的「無符號在所有」狀態,逐步擴大它的時間,一個符號 - 和停止當它遇到第一個[/if]部分在字符串的流程中。否則,它實際上開始於消費全部該字符串,一次釋放一個符號 - 並在面對字符串流中的最後[/if]部分時停止。

+1

它的工作原理,你能解釋一下爲什麼? – nick

+0

感謝您的解釋! – nick