我会用一个模式像这样
$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