preg match all получить группу несколько раз

0

Я пытаюсь получить регулярное выражение, чтобы получить подгруппу каждый раз, когда она будет найдена. Это мой код:

$string2 = 'cabbba';
preg_match_all('#c(a(b)*a)#',$string2,$result3,PREG_SET_ORDER);
var_dump($result3);

Моя цель - каждый раз получать "b" в виде захваченной группы (так 3 раза). Эти коды выводят следующее:

array (size=1)
  0 => 
    array (size=3)
      0 => string 'cabbba' (length=6)
      1 => string 'abbba' (length=5)
      2 => string 'b' (length=1)

Я хочу, чтобы он показывал "b" каждый раз, когда он появляется, поэтому что-то вроде этого

array (size=1)
  0 => 
    array (size=3)
      0 => string 'cabbba' (length=6)
      1 => string 'abbba' (length=5)
      2 => array (size=3)
         0 => string 'b' (length 1)
         1 => string 'b' (length 1)
         2 => string 'b' (length 1)

Это упрощенный пример, в реальном коде подшаблон "b" будет отличаться каждый раз, но он следует той же схеме.

  • 0
    (b)* захватывает только последний b в большем количестве б
  • 0
    Да, и мой вопрос, как получить все (в разных группах, поэтому нет (b *))
Показать ещё 2 комментария
Теги:

2 ответа

3
Лучший ответ

Это было бы возможно только с помощью привязки \G

(?:ca|\G)(b)(?=b|(a))

DEMO

0

Вы пытались использовать не-жадный модификатор для вашего b*?

$string2 = 'cabbba';
preg_match_all('#c(a(b)*?a)#', $string2, $result3, PREG_SET_ORDER);
var_dump($result3);

Извините, если это не то, что вы спросили, я не уверен, что я действительно понял ваши потребности...

UPDATE: Извините, предыдущий ответ неправильный, пожалуйста, проигнорируйте его...
Я пытаюсь разработать правильный...
Просто попробуйте что-то вроде

preg_match_all('#c(a(?:(b{1}))*a)#', $string2, $result3, PREG_SET_ORDER);

но он не работает, либо... :-(

ОБНОВЛЕНИЕ 2:
См. Ответ Avinash Raj, я думаю, это неплохо...

  • 0
    Он возвращает то, что ОП уже имеет и не хочет иметь.
  • 0
    Вы правы, я не проверял, извините ... :-(
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню