2015-08-31 2 views
0

У меня есть следующее регулярное выражение шаблонRegex проблема после попытки и не суметь в течение часа

/{{(?P<expression>if|IF)\s+?\(?\s+?(?P<statement>.*)\s?\)\s+?}}\s+?(?P<output>.*)\s+?{?{?(?P<statement2>else)?}?}?\s+?(.*)\s+{{endif}}/gmi 

Чтобы соответствовать следующим образом:

{{if   (\RAD\Security::Version() != 1.0   ) }} 
<p>Sorry you do not have the latest version installed...</p> 
{{else}} 
<p>Yay</p> 
{{endif}} 

{{if (\RAD\Security::Version() != 1.0   ) }} 
<p>Sorry you do not have the latest version installed...</p> 
<p>Yay</p> 
{{endif}} 

Однако по какой-то причине один из круглых скобок и избыточного пробельных как-то зафиксировано в «заявлении»

Это также не должно волновать {{else}}

Вся помощь была бы замечательной, ударяя головой об этом.

Regex Demo

+4

Не могли бы вы попытаться сделать свой заголовок более наглядным? Все здесь «пытаются» решить какую-то «проблему» и «провалиться» в ней (иначе они не будут спрашивать), продолжительность вашего попытки ничего не говорит о проблеме и тот факт, что это о RegEx можно увидеть на основе тегов и, следовательно, не нужно включать в заголовок. –

+0

У вас есть рекомендация? – zanderwar

+1

Не знаете, почему голос вниз, ясно показывает, что я пробовал, и проблемы только «незначительные» просто боль ... – zanderwar

ответ

1

Вот фиксированная версия:

{{ 
    (?P<expression>if|IF) 
    \s+\(\s*(?P<statement>.*?)\s*\)\s* 
}} 
\s*(?P<output>.*?)\s* 
(?:{{(?P<statement2>else)}})? 
\s*(.*?)\s* 
{{endif}} 

Demo

Вы в основном неправильно ленивые кванторы и сделал ( необязательными, поэтому пробельные был подобран по \s+? на праве \(.

Часть {{else}} была неправильной, так как вы сделали каждый компонент этого токена необязательным независимо друг от друга. Я сгруппировал его в одну необязательную группу.

Также сделайте себе одолжение и используйте опцию x для более длинных узоров.

Двигаясь дальше, я думаю, что модель нуждается еще немного реструктуризации:

{{ 
    (?P<expression>if|IF) 
    \s+\(\s*(?P<statement>.*?)\s*\)\s* 
}} 
\s*(?P<then>.*?)\s* 
(?: 
    {{else}} 
    \s*(?P<else>.*?)\s* 
)? 
{{endif}} 

Demo

Теперь, вы получаете три захвата группы: statement, then и else.

+0

Эй, увы, ты прав на деньги, но на втором матче '

Yay!

'также должен быть отделен от выхода, возможно ли это? – zanderwar

+0

@ Zanderwar I расширил ответ –

+0

Спасибо за это - работает! – zanderwar

1

Вот что вы можете использовать:

{{ 
(?P<expression>if) 
\s*\(\s* 
(?P<statement>.*) 
\s*\)\s*}}\s* 
(?P<output>.*) 
\s* 
(?:       # start of optional {{else}} 
{{ 
(?P<statement2>else) 
    }}\s* 
)?       # end 
(.*) 
\s+ 
{{endif}} 

См demo, а вот verbose regex version.

я заменил \s+? с \s*, так как вы хотите соответствовать дополнительный пробел, и я поставил всю {{else}} часть в качестве дополнительного использования без захвата группы с ? (1 или 0 раз) квантора.

Обратите внимание, что нет смысла использовать (if|IF), поскольку у вас уже есть модификатор i, который делает шаблон нечувствительным к регистру.

+0

Не могли бы вы объяснить, какой результат вы ожидаете в самом вопросе? –

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