Разбор блока с помощью регулярного выражения PHP - PullRequest
3 голосов
/ 10 июня 2011

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

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

Я не очень хорош в RegEx, но вот что я попробовал:

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

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

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

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

Ответы [ 2 ]

8 голосов
/ 10 июня 2011

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

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

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

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

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

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

preg_match_all('/^%%%%(.*?)%%%%(.*?)%%%%\/\1%%%%$/sm',$input,$matches);
0 голосов
/ 10 июня 2011

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

...