Вам необходимо разрешить точке совпадать с новыми строками и разрешить совпадение ^
и $
в начале и конце строк (а не только всей строки):
preg_match_all('/^%%%%(.*?)%%%%(.*?)%%%%\/(.*?)%%%%$/sm',$input,$matches);
Параметр s
(однострочный) позволяет точкам соответствовать любому символу, включая символы новой строки.
Параметр m
(многострочный) позволяет ^
и $
совпадать в начале и конце строк.
Параметр i
не нужен в вашем регулярном выражении, поскольку в нем нет символов, чувствительных к регистру.
Затем, чтобы ответить на вторую часть вашего вопроса: если blockname
одинаково в обоих случаях, то вы можете сделать это явным образом, используя обратную ссылку на первую группу захвата:
preg_match_all('/^%%%%(.*?)%%%%(.*?)%%%%\/\1%%%%$/sm',$input,$matches);