2013-05-01 2 views
0

Механизм шаблонов обрабатывает как {{foo}}, так и {{{bar}}}, они соответствуют различным способам обработки.Создание взаимоисключающих, не перекрывающихся регулярных выражений

В настоящее время источник обрабатывается preg_replace: {{\s*(.+?)\s*}} и {{{\s*(.+?)\s*}}}.

Проблема в том, что эти регулярные выражения перекрываются, например. {{\s*(.+?)\s*}} совпадений в {{{bar}}}.


Важное примечание: маркеры {{, {{{, }}, }}} конфигурируются пользователем в реальном коде. Поэтому обычные решения, такие как [^{}], не могут быть использованы.


Текущее решение заменить {{{ }}} перед тем, чтобы {{ }}-х годах, но этого не достаточно прочным. Действительно, маркеры настраиваются пользователем, пользователь может легко установить маркеры на значения, которые нарушают приложение.

Я пытаюсь сделать регулярные выражения, которые являются взаимоисключающими, а не зависят от заказа. Я уже пробовал использовать утверждения, условные обозначения и т. Д. Без успеха. Любая помощь будет принята с благодарностью.

Кстати, использование регулярных выражений не является обязательным, если код не становится перекрытым.

+0

Только для того, чтобы увеличить видимость в «laravel», если вы хотите, чтобы тег шаблона мог поменять его на лезвие. –

ответ

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' 

Я изменил свой внутренний тест текст, чтобы искать любой не «} или„{“символы таким образом, все символы внутри возвращаются.

+0

Извините, я хотел добавить, что это было написано в PowerShell. –

+0

Я отредактировал мою чтобы подчеркнуть этот момент: знак ers '{{', '{{{', '}}', '}}}' настраиваются пользователем в реальном коде. Поэтому обычные решения, такие как '[^ {}]', не могут быть использованы. Спасибо за вашу помощь. –

+0

Если маркеры настраиваются пользователем в реальном коде, вы уже знаете, что эти значения и могут заменить их в регулярное выражение. –

Смежные вопросы