0

模板引擎同时处理{{foo}}{{{bar}}},它们对应于不同的处理。

目前,源是preg_replace这样处理的:{{\s*(.+?)\s*}}{{{\s*(.+?)\s*}}}

问题是,这些正则表达式重叠,例如{{\s*(.+?)\s*}}匹配{{{bar}}}.


重要提示:标记{{, {{{, }},}}}是用户可在实际代码中配置的。[^{}]所以不能使用通常的解决方案。


当前的解决方案是替换{{{ }}}'s before {{ }}',但这还不够健壮。实际上,标记是用户可配置的,用户可以轻松地将标记设置为破坏应用程序的值。

我正在尝试制作更强大的正则表达式,它们是互斥的,而不是依赖于顺序的。我已经尝试过使用断言、条件等但没有成功。任何帮助将不胜感激。

顺便说一句,只要代码不变得过长,使用正则表达式不是强制性的。

4

1 回答 1

0

听起来你需要尝试一些环顾四周。这是我的示例,它显示了两个不同的匹配测试

$Matches = @()
$String = 'A template{{{bar}}} engine processes both {{foo}} and {{{bar}}}, they correspond to different treatments.'
write-host "Foo matches"
([regex]'(?<!{){{([^{}]*)}}(?!})').matches($String) | foreach {
    write-host "at $($_.Groups[1].Index) = '$($_.Groups[1].Value)'"
    } # next match

Write-Host 
write-host "Bar matches"
$Matches = @()
([regex]'{{{([^{}]*)}}}').matches($String) | foreach {
    write-host "at $($_.Groups[1].Index) = '$($_.Groups[1].Value)'"
    } # next match

产量

Foo matches
at 44 = 'foo'

Bar matches
at 13 = 'bar'
at 57 = 'bar'

我已经修改了您的内部文本测试以查找任何非“}”或“{”字符,这样所有字符都将返回。

于 2013-05-01T04:11:12.843 回答