würde ich ein Muster wie diese
$patt = '/(?P<open>\{\{)|(?P<body>[-0-9a-zA-Z._]+)|(?P<whitespace>\s+)|(?<opperators>and|or|==)|(?P<close>\}\})/'
preg_match_all($patt, $text, $matches);
Der Ausgang viel zu lange verwenden, aber Sie können darüber Schleife und Gegenstände dann nach oben anzupassen, im Grunde ist es die Zeichenfolge tokeninzing.
Es ist wie dieses
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 => '',
....
)
)
Dann in einer Schleife Sie Spiel sagen kann [0][0]
open
Tag ist, match [0][1]
ist body
Spiel [0][3]
ist ein weiterer open
usw. und durch Spur öffnen und schließen Tags zu halten, kann man arbeiten aus der Verschachtelung. Es wird Ihnen sagen, was enge Übereinstimmung Operator Spiel usw. ein offenes Spiel Körper Spiel ist ...
Alles, was Sie brauchen, ich habe keine Zeit für eine vollständige Aufarbeitung an einer Lösung haben ...
Ein schneller Beispiel wäre ein open
gefolgt von einem body
gefolgt von einem close
ist eine Variable. Und eine open
gefolgt von und body
und eine andere open
ist eine Funktion. p Sie können auch zusätzliche Muster hinzufügen, indem Sie wie folgt (?P<function>function\.)
mit dem Rohr hinein wie '/(?P<open>\{\{)|(?P<function>function\.)|...
einfügen. Dann könnten Sie Stichworte wie function
foreach
block
etc ... was Sie haben.
Ich habe vollwertige Template-Systeme mit dieser Methode geschrieben. In meinem Template-System ich die REGx in einem Array wie diese
[ 'open' => '\{\{', 'function' => 'function\.', .... ]
bauen und komprimieren es dann zum eigentlichen REGx, macht das Leben einfach ...
$r = [];
foreach($patt_array as $key=>$value){
$r[] = '(?P<'.$key.'>'.$value.')';
}
$patt = '/'.implode('|', $r).'/';
Etc ...
Wenn du folgst.
Was meinen Sie mit "erfassen Sie den umgebenden Text"? – aaaaaa123456789
Bitte klären Sie die Anforderungen. Warum leere Elemente in der Ausgabe? Warum wird das letzte '{{foo' von' more_text' getrennt? –
preg_match_all, anstelle von preg_match. '/ \ {\ {| -0-9a-zA-Z ._] + | \} \} /' Das sind 3 Muster, dann verarbeitest du sie und verfolgst offene, Klammerpaare und Körpertreffer. Dann können Sie verschachteln. – ArtisticPhoenix