我會用一個模式像這樣
$patt = '/(?P<open>\{\{)|(?P<body>[-0-9a-zA-Z._]+)|(?P<whitespace>\s+)|(?<opperators>and|or|==)|(?P<close>\}\})/'
preg_match_all($patt, $text, $matches);
產量遠遠要長,但你可以遍歷它,然後匹配的項目時,基本上它的tokeninzing的字符串。
它這樣
array (
0 =>
array (
0 => '{{',
1 => 'bar.function',
2 => '{{',
3 => 'demo.funtion',
4 => '{{',
5 => 'inner',
6 => '}}',
7 => ' ',
8 => '==',
9 => ' ',
10 => 'demo',
11 => '}}',
12 => ' ',
13 => 'and',
14 => ' ',
15 => '{{',
16 => 'bar',
17 => '}}',
18 => ' ',
19 => 'or',
20 => ' ',
21 => 'foo',
22 => '}}',
),
'open' =>
array (
0 => '{{',
1 => '',
2 => '{{',
3 => '',
4 => '{{',
5 => '',
6 => '',
7 => '',
8 => '',
9 => '',
10 => '',
11 => '',
12 => '',
13 => '',
14 => '',
15 => '{{',
16 => '',
17 => '',
18 => '',
19 => '',
20 => '',
21 => '',
22 => '',
),
),
'body' =>
array (
0 => '',
1 => 'bar.function',
2 => '',
3 => 'demo.funtion',
4 => '',
5 => 'inner',
6 => '',
....
)
)
然後在一個循環中,你可以告訴匹配[0][0]
是open
標籤,匹配[0][1]
是body
比賽[0][3]
是另一個open
等,並通過跟蹤打開和關閉標籤,你可以工作出巢。它會告訴你什麼是一個開放的比賽身體的比賽勢均力敵的比賽,操作者匹配等等
你需要每一件事情,我沒有時間上的解決方案的完整的後處理...
快速示例將是一個open
,然後是body
,然後是close
是一個變量。 open
後跟body
,另一個open
是一個函數。 p 您也可以添加額外的圖案,像這樣插入(?P<function>function\.)
,其中的管道就像'/(?P<open>\{\{)|(?P<function>function\.)|...
一樣。然後,你可以拿起關鍵字,如function
foreach
block
等...你有什麼。
我用這種方法編寫了完整的模板系統。在我的模板系統我建至REGx在這樣
[ 'open' => '\{\{', 'function' => 'function\.', .... ]
數組,然後將其壓縮到實際至REGx,讓生活變得簡單......
$r = [];
foreach($patt_array as $key=>$value){
$r[] = '(?P<'.$key.'>'.$value.')';
}
$patt = '/'.implode('|', $r).'/';
等...
如果你遵循。
「捕捉周圍的文字」是什麼意思? – aaaaaa123456789
請澄清要求。爲什麼要在輸出中清空元素?爲什麼最後一個'{{foo'從'more_text'中分離出來? –
preg_match_all,而不是preg_match。 '/ \ {\ {| | [-0-9a-zA-Z ._] + | \} \} /'這是3種模式,然後您對它們進行處理並跟蹤開放式關閉括號匹配和正文匹配。然後你可以做嵌套。 – ArtisticPhoenix