Приветствую всех знатоков регулярок Помогите решить костыль. Код (PHP): $html='{block} 0 {block1} 2 {/block1} {/block}'; preg_replace_callback('~{(.+?)}(.+?){\/\1}~si',function($reg) { print_r($reg); },$html); Возвращает: Код (PHP): Array ( [0] => {block} 0 {block1} 2 {/block1} {/block} [1] => block [2] => 0 {block1} 2 {/block1} ) , нашло только первый. Почему так? А надо, чтобы вернуло: Код (PHP): Array ( [0] => {block} 0 {/block} [1] => block [2] => 0 ) Array ( [0] => {block1} 2 {/block1} [1] => block1 [2] => 2 ) В регулярках не силен! Помогите решить конфликт пожалуйста, будьте так добры
Re: Блоки внутри блоков ну так оно ищет каждое новое вхождение не с 0 позиции, а с последней найденной (если таковое было), в твоем случае после нахождения первого варианта поиск дальше будет идти начиная с после {/block}, т.е. твлю эту штуку надо решать по другому и кстати, забегая вперед вроде как ее так просто через регулярное выражение не решить. Добавлено спустя 2 минуты 7 секунд: вот загляни в эту тему, может в ней найдется что то полезное - viewtopic.php?f=18&t=48868&p=388664 Добавлено спустя 38 секунд: и если вдруг то решение что давалось в конце (работоспособное) подойдет, скажешь, я дам более правильное.
Re: Блоки внутри блоков а через жадность разве никак не уговорить регулярке находить куски сначала внутри, потом если их заменить и находить дальше?
Re: Блоки внутри блоков igordata, я как понял тут проблема у него с какой позиции начинается поиск следующего вхождения, ему надо что бы с начала, а оно ищет с конца.
Re: Блоки внутри блоков Я знаю, что есть рекурсия, но как ее активировать, не понимаю ничерта... Уже что только не пробовал. Кто-нибудь, выручайте...(((
Re: Блоки внутри блоков Вообщем проблема решена. Написал такую регулярку: ~{/([^}]+)\s([^}]+)}~siU Ну это те у которых есть еще ключ через пробел. {/block name} Нашло все конечные закрывающие теги А потом склеил все это ~{(.+?)}(.+?){\/\1\s(.+?[}]|.+?)}~si , заработало еху
хрень заключается в том, что у preg_replace_callback нельзя задать с какой позиции искать, так можно было бы сделать рекурсию.
Я пробовал спаивать разные рекурсии в одной, но результат был один и тот же, я не силен в регулярках и делал видимо не правильно. В чем - то там есть исход, регулярка будет длинная, я не знаю просто, что туда писать... Не могу никак еще понять их. Приходится жертвовать. Я не знаю как написать 1-ну регулярку, пришлось прогонять циклом и в цикле вызывать еще одну. Их очень много блоков, ну работает шустро, все это дело срабатывает 1 раз до кеширования, по этому не так важно. Вся логика разделяется после.