将类似 Lisp 的字符串解析为标记和文字文本

问题描述 投票:0回答:1

使用 PHP v8 preg_match_all($Matches) 函数的“匹配”参数,我需要匹配文字文本列表 and 分隔标记。

$x = preg_match_all($Regex, $Template, $Matches, PREG_OFFSET_CAPTURE); // Parse the template.

要注意的是令牌应该能够嵌套。我只需要匹配 nest 中最外层的标记。

例子:

This {is {{Par}m1}} plus {{Par{m3a{{Parm3b}}}} a}nd {{Parm4a||{{Par}m4b||{{Parm4c||{{Parm4d||Parm}}}}}}}}.

应该解析成这个:

 Match 1: This {is
 Match 2: {{Par}m1}}
 Match 3:  plus
 Match 4: {{Par{m3a{{Parm3b}}}}
 Match 5:  a}nd
 Match 6: {{Parm4a||{{Par}m4b||{{Parm4c||{{Parm4d||Parm}}}}}}}}
 Match 7: .

注意上面的single花括号should be allowedin tokens or in text.

只有双花括号被认为是标记定界符。

到目前为止,我所拥有的正则表达式是有效的仅当文本或标记中没有单个花括号时。

我的正则表达式:

(?:(?!(\{\{)).)+|((\{\{)((?>[^{}]+|(?2))*)(\}\}))

我无法弄清楚如何在不破坏匹配列表的情况下在文本或内部标记中允许单个花括号。

非常感谢任何帮助!

更新

我正在继续解决这个问题并提出这个:

\{\{(?R)*\}\}|[^{}]+

它使用递归运算符,但它仍然遇到同样的问题,因为单个花括号会破坏解析。

正确的定界符用于打开和关闭双花括号“{{”和“}}”。

php regex parsing token preg-match-all
1个回答
1
投票

我想我找到了解决方案。到目前为止,测试似乎有效。

正则表达式是

(\{\{)(?R)*(\}\})|(?:(?!\{\{|\}\}).)+

测试

解析这个:

{{one}}{}This is {{Pa}rm1}} p{}lus {{P{ar{}m2}} and2 {{Close1}}{{Close2}} {{Par{m3a{{Parm3}b}}}} and {{Par{m4a||{{Parm4b||{{Parm4c||{{Parm4d||Pa}rm}}}}}}}} end {{Par{}m5}}.

产生这个:

{{one}}
{}This is 
{{Pa}rm1}}
 p{}lus 
{{P{ar{}m2}}
 and2 
{{Close1}}
{{Close2}}
 
{{Par{m3a{{Parm3}b}}}}
 and 
{{Par{m4a||{{Parm4b||{{Parm4c||{{Parm4d||Pa}rm}}}}}}}}
 end 
{{Par{}m5}}
.

到目前为止似乎工作。

© www.soinside.com 2019 - 2024. All rights reserved.