preg_match_all - не составить простое выражение

riff

Новичок
preg_match_all - не составить простое выражение

Стыдно, но не составить простое выражение.

Строка: "aaaaa{@bbb}ccccc"
preg_match_all: (захватить текст до {@текст}) и (захватить {@текст}, если есть)
с флагом PREG_SET_ORDER

если написать /(.*)(?:\{@(.*?)\})/ , то не захватывает "ccccc"
если написать /(.*)(?:\{@(.*?)\})?/ , то захватывает всю строку
если написать /(.*?)(?:\{@(.*?)\})?/ , то захватывает буковки "a" каждую в отдельности.

хотелось бы, что бы вернула массив:
PHP:
array(
  array(
    'aaaaa',
    'bbb'
  ),
  array(
    'ccccc',
    ''
  )
);
 

riff

Новичок
Автор оригинала: cDLEON
А зачем вам ссссс в ещё одном подмассиве?
как зачем? функция же проверяет всю строку. Первая подстрока удовлетворяющая условию будет "aaaaa{@bbb}", вторая должна быть "ccccc", т.е. вся оставшаяся строка.
 

HraKK

Мудак
Команда форума
А зачем тут Регулярки??!
strpos substr strstr
Вам помогут
 

riff

Новичок
Автор оригинала: HraKK
А зачем тут Регулярки??!
за тем, что вместо "aaaaa{@bbb}ccccc" там может быть написано "aaaaa{@bbb}ccccc{@ddd}eeeee"
и следовательно возвращаемый массив будет
PHP:
array(
  array(
    'aaaaa',
    'bbb'
  ),
  array(
    'ccccc',
    'ddd'
  ),
  array(
    'eeeee',
    ''
  )
);
-~{}~ 02.11.07 12:48:

ХА-ХА. Я умный :) - я составил. Вызываю вас на бой - кто лучше напишет...
PHP:
$text = 'aaaaa{@bbb}ccccc{@ddd}eeeee';
preg_match_all('/(.*?)?(?:\{@(.*?)\}|\z)/', $text, $out, PREG_SET_ORDER);
Есть проблемка: избавиться от самого последнего массива (он всегда пустой возвращается.).

-~{}~ 02.11.07 13:06:

+ немного упростил.
 
Сверху