Вроде бы очень мощное, хорошее средство для работы со строками. Однако находится немало ограничений. Вот например.
Предположим, есть текст.
bla !1! — !2! !3! bla !5! !6!
Нужно взять все строки типа !что-то!, находящиеся между bla и bla и не брать остальные.
Очевидный метод, который сразу приходит на ум
$str=’bla !1! — !2! !3! bla !5! !6!’;
$img=’/bla.*?(![^!]*!.*?)*bla/i’;
preg_match_all($img,$str,$regs);
print_r($regs);
показывает нам, что для подмасок с квантификаторами захватывается только последнее совпадение. Что, впрочем, очевидно, т.к. нумеруются подмаски тупо по скобочкам в шаблоне.
Рабочим видится только вариант с двумя регулярниками,
$str=’bla !1! — !2! !3! bla !5! !6!’;
$img=’/bla(.*?)bla/i’;
preg_match_all($img,$str,$regs);
$str=$regs[1][0];
$img=’/![^!]*!/i’;
preg_match_all($img,$str,$regs);
print_r($regs);
Возможно ли решить задачу одним регулярным выражением?