непонятно поведение в регулярном выражении

Роберт

Аналитик
непонятно поведение в регулярном выражении

Есть текст:
Код:
12.03.2009 11:54:21
 zaq12345
  1111112
  aaaaaaa3
  222ddd333
  bbbb1111b
27.03.2009 23:54:21
 zz
  aaaaaaaaa
  111111111
(ну тоесть блок выглядит так: дата, потом одна строка с отсупом в один пробел и потом одна или несколько строк с отступом в 2 пробела. И таких блоков может быть много)
Написал регулярное выражение:
PHP:
preg_match_all('#(\d\d\.\d\d\.\d\d\d\d \d\d:\d\d:\d\d)\r\n (.+?)((\r\n  .+)+)#',$Tekst,$Rez);
которое должно захватывать отдельно дату , отдельно строку с одним пробелом и отдельно весь набор строк с отступом в 2 пробела.
А он почему-то берёт только первую строку из тех что с отступом в 2 пробела. Почему? Запрос полностью корректный - жадный.
Причём самое интересное что пробую запустить это же выражение на PCRE в других языках программирования - захватывает всё до конца блока.
Если вместо последнего плюса напишу {3,} - захватит три , но четвёртую строку уже брать не будет.
Корректно работает только если заменю последнюю точку на "не символы перехода строки" , тоесть на: ((\r\n [^\r\n]+)+)
Но почему в РНР не работает так как он написан изначально? Всё же корректно!
Читается как: переход строки , два пробела , потом как можно больше любых символов , но поскольку нет модификатора "s" то останавливается перед переходом на новую строку , и дальше повторить данный блок как можно больше раз.
Есть у кого-то идеи почему последний плюс обрабатывается как не жадный?
 

Роберт

Аналитик
Если ты это просто так написал (типа как , то в чём обычно путаются) - то здесь ничего не напутано.
1) именно ' , чтобы текст был таким как передал без интерпретаций РНР
2a) s - мне совершенно не нужен , иначе первый же жадный .+ захватит всё до конца текста
2б) m - мне тоже не нужно , так как я не использую ^ и $
 

DiMA

php.spb.ru
Команда форума
zerkms
> 1. отличие ' от "

это здесь не причем, учи матчасть
для регов "\\n" и "\n" равноценны (реги дублируют все спец. символы языка),
поэтому по барабану как писать: "\n" "\\n" '\n' '\\n'


Роберт
не пори чушь, если не понимаешь...
все реги исполняются либо с 'm', либо с 's'
по умолчанию с модификатором 'm' (даже если ты не указал)

тебе НУЖЕН модификатор 's', чтобы шаблон рега стал многострочным (жадность тоже не причем)

подсказка: (.+?) замени на ([^\r\n]+), и даже жадность трогать не понадобится
 

x-yuri

Новичок
все реги исполняются либо с 'm', либо с 's'
по умолчанию с модификатором 'm' (даже если ты не указал)
:confused: странно, а в документации другое сказано

Роберт твоя проблема в том, что . соответствует \r (даже при отсутствии s)
 
Сверху