Блок синтаксического анализа с регулярным выражением php
Я пытаюсь написать (я думаю) довольно простое регулярное выражение с помощью PHP, но оно не работает. В основном у меня есть блок, определенный следующим образом:
%%%%blockname%%%%
stuff goes here
%%%%/blockname%%%%
Я не очень хорош в регулярных выражениях, но вот что я попробовал:
preg_match_all('/^%%%%(.*?)%%%%(.*?)%%%%\/(.*?)%%%%$/i',$input,$matches);
Он возвращает массив с 4 пустыми записями.
Я полагаю, что ему также, помимо реальной работы, нужен какой-то указатель для третьего совпадения, потому что он должен быть равен первому?
Пожалуйста, просветите меня:)
2 answers
Вам нужно разрешить точке совпадать с новыми строками, а также разрешить ^
и $
совпадать в начале и конце строк (не только всей строки):
preg_match_all('/^%%%%(.*?)%%%%(.*?)%%%%\/(.*?)%%%%$/sm',$input,$matches);
Опция s
(однострочная) делает точку соответствующей любому символу, включая новые строки.
Опция m
(многострочная) позволяет ^
и $
совпадать в начале и конце строк.
Опция i
в вашем регулярном выражении не нужна, так как в ней нет символов, чувствительных к регистру.
Затем, чтобы ответить на вторую часть вашего вопроса: если blockname
одинаково в обоих случаях, то вы можете сделать это явным, используя обратную ссылку на первую группу захвата:
preg_match_all('/^%%%%(.*?)%%%%(.*?)%%%%\/\1%%%%$/sm',$input,$matches);
Я почти уверен, что вы не можете, так как для этих операций потребуется сохранить переменную, а вы не можете в регулярном выражении. Вы должны попытаться сделать это с помощью встроенного анализатора токенов PHP. http://php.net/manual/en/function .token-get-all.php