Блок синтаксического анализа с регулярным выражением php


Я пытаюсь написать (я думаю) довольно простое регулярное выражение с помощью PHP, но оно не работает. В основном у меня есть блок, определенный следующим образом:

%%%%blockname%%%%
stuff goes here
%%%%/blockname%%%%

Я не очень хорош в регулярных выражениях, но вот что я попробовал:

preg_match_all('/^%%%%(.*?)%%%%(.*?)%%%%\/(.*?)%%%%$/i',$input,$matches);

Он возвращает массив с 4 пустыми записями.

Я полагаю, что ему также, помимо реальной работы, нужен какой-то указатель для третьего совпадения, потому что он должен быть равен первому?

Пожалуйста, просветите меня:)

Author: Kokos, 2011-06-10

2 answers

Вам нужно разрешить точке совпадать с новыми строками, а также разрешить ^ и $ совпадать в начале и конце строк (не только всей строки):

preg_match_all('/^%%%%(.*?)%%%%(.*?)%%%%\/(.*?)%%%%$/sm',$input,$matches);

Опция s (однострочная) делает точку соответствующей любому символу, включая новые строки.

Опция m (многострочная) позволяет ^ и $ совпадать в начале и конце строк.

Опция i в вашем регулярном выражении не нужна, так как в ней нет символов, чувствительных к регистру.

Затем, чтобы ответить на вторую часть вашего вопроса: если blockname одинаково в обоих случаях, то вы можете сделать это явным, используя обратную ссылку на первую группу захвата:

preg_match_all('/^%%%%(.*?)%%%%(.*?)%%%%\/\1%%%%$/sm',$input,$matches);
 8
Author: Tim Pietzcker, 2011-06-10 07:44:14

Я почти уверен, что вы не можете, так как для этих операций потребуется сохранить переменную, а вы не можете в регулярном выражении. Вы должны попытаться сделать это с помощью встроенного анализатора токенов PHP. http://php.net/manual/en/function .token-get-all.php

 0
Author: elslooo, 2011-06-10 07:41:05