Получение подстрок с пом. preg_match_all

alpes

Весь мир на ладони
Получение подстрок с пом. preg_match_all

Есть строка:
PHP:
$str="...labuda....
1. lyalyalya 456
 lyalyalya asd
20. trullyalya
***";
Нужно ее разбить на подстроки такого вида:
от 'НОМЕР).' и до следующего 'НОМЕР).', либо до '***'
Т.е. получить:
PHP:
$arr[0]="1. lyalyalya 456 lyalyalya";
$arr[1]="20. trullyalya";
Одолели уже эти регулярные, помогите пожалуйста составить рег.выражение для этой задачи

PHP:
preg_match_all('([0-9]+\)\.([все кроме: номер). либо ***]+))',$str,$arr);
 

alpes

Весь мир на ладони
Решил задачу немного через одно место:
1. С пом. preg_replace заменяю все 'НОМЕР).' на '***НОМЕР).'
2. затем с пом. explode по разделителю '***' разделяю на подстроки
3. удаляю элементы полученного массива 0 и count()-1 (последний).

Наверняка должно быть более простое решение, искренне буду рад любому предложению.
 

Profic

just Profic (PHP5 BetaTeam)
preg_split ('~[0-9]+\.|\*\*\*~', $str);
это замена пункта 1 и 2...
 

alpes

Весь мир на ладони
Спасибо, прада это немного не подходит. Так вырезаются и все 'НОМЕР.', а их нужно оставить.
 

Profic

just Profic (PHP5 BetaTeam)
Хе, а у тебя нигде в тексте нет НОМЕР).
В общем, если тебе с НОМЕР). то тогда так
preg_split ('~\d+\)\.|\*\*\*~', $str);
 

alpes

Весь мир на ладони
;) добавить/убрать \) это я соображу, пример взят не с конкретной задачи, а модифицирован для простоты восприятия.
Повторюсь: preg_split таким образом вырезает те самые НОМЕР). / НОМЕР. а этого не стоит делать.
 

Profic

just Profic (PHP5 BetaTeam)
а, понял :)
preg_split ('~.(?=\d+\)\.)|\*\*\*~', $str);
только тогда должен быть один лишний символ (пробел, новая строка) в строке между концом предыдущей подстроки и началом следующей
 

alpes

Весь мир на ладони
так вместо 20). xzxzxzx оставляет только 0). xzxzxzx, т.е. одну цифру... :(
 

alpes

Весь мир на ладони
Получилось так: preg_split ('~\s(?=\d+\)\.)|\*\*\*~', $str);

Теперь бы еще все через preg_match_all сделать :)
 

alpes

Весь мир на ладони
Подскажите, по идее такое возможно задать с пом. рег. выражений:
все кроме: НОМЕР). либо *** или другими словами все до: НОМЕР). либо ***
или врядли, чтоб не парил уже мозги и остановился на том что есть.
 

Profic

just Profic (PHP5 BetaTeam)
именно, это (все кроме: НОМЕР). либо ***):
~((.(?!\d+\)\.|\*\*\*))+)~

но нафига такой изврат, если preg_split работает
 

alpes

Весь мир на ладони
>но нафига такой изврат, если preg_split работает
См. 1-й топик, скорее всего сбил с толку 2-ым. Именно изврат использовать preg_split, unset и count, если все эти действия заменяются одним preg_match_all (если конечно верно сотавить выражение).

Собственно имею полу-рабочий варианТ:
PHP:
preg_match_all('/(\d+\.((.(?!(\d+\.)|(\*\*\*)))+))/', $str,$out);
Но в таком варианте новая строка \n также служит окончанием нашего поиска также как и НОМЕР. либо ***. Т.е. из строки:
PHP:
$str="xzxz 2. GHhh \n jij 20. jijio ***";
получим
PHP:
$out[0]="2. GHhh ";
а надо:
PHP:
$out[0]="2. GHhh \n jij ";
Пытался использовать модификаторы патэрна 's' (PCRE_DOTALL), но он не дал эффекта. Помогите довести до ума: '/(\d+\.((.(?!(\d+\.)|(\*\*\*)))+))/s'
 

Profic

just Profic (PHP5 BetaTeam)
Гонишь :)

<?php
$str="xzxz 2. GHhh \n jij 20. jijio ***";
preg_match_all('/\d+\.(?:(?:.(?!\d+\.|\*\*\*))+)/s', $str,$out);
echo '<pre>';
print_r ($out);
echo '</pre>';
?>

выдает
Код:
Array
(
    [0] => Array
        (
            [0] => 2. GHhh 
 jij
            [1] => 20. jijio
        )

)
 

alpes

Весь мир на ладони
>Гонишь
Ты находишь эти строки одинаковыми? :
'/(\d+\.((.(?!(\d+\.)|(\*\*\*)))+))/s'
и
'/\d+\.(?: (?:.(?!\d+\.|\*\*\*))+)/s'
С примененными конструкциями '?:' '?=' '?!' я тока разбираюсь.

Все же искренне СПАСИБО за помощь!
 

Profic

just Profic (PHP5 BetaTeam)
Ты находишь эти строки одинаковыми?
Все, что я сделал - это убрал лишние скобки, а те которые не уберешь превратил в незахватываемые (т.е. не появляющимися в массиве $out) - для простоты отображения. Во всем остальном они идентичны...
Вообще - чем меньше скобок, тем понятнее регэксп :)
 

alpes

Весь мир на ладони
Хм. точна. Чето я перемудрил а в форуме составил правильный пример :D

Profic, еще раз огромное СПАСИБО :)
 
Сверху