На первый взгляд это кажется довольно простым (извинения, если я что-то упустил). Для первой части используйте повторяющиеся совпадения:
XX(.*?)YY(.*?)ZZ
Для более длительного матча я предлагаю отдельный матч:
XX(.*?)YY(.*)ZZ
EDIT
Aha! шаблоны перекрываются (спасибо, ребята). В этом случае вам придется зацикливаться. Вероятно, легче всего убрать любого ведущего .*?XX
перед повторной попыткой матча. В Perl Land вы бы использовали
while (/XX(.*?)YY(.*?)ZZ/) {
print "[$1] [$2]\n";
s/^.*?XX//;
}
Если вы отчаянно нуждаетесь в единственном регулярном выражении, то m//g
в контексте массива придет вам на помощь. (Не уверен, как может выглядеть соответствующий php.)
@a = /XX(?=(.*?YY.*?ZZ))/g;
Массив @a
будет содержать перекрывающиеся строки, но с удаленным начальным XX
.