Бесконечное совпадение подвыражений (регулярных выражений) возвращает только одно совпадение - PullRequest
1 голос
/ 19 января 2009

У меня есть регулярное выражение, подобное этому (очень упрощенное):

^(ab)*$

И я против этого:

abababababababab

Когда я запускаю его через preg_match:

preg_match('/$(ab)*$/', 'abababababababab', $matches);
print_r($matches);

Я получаю это:

Array
(
    [0] => abababababababab
    [1] => ab
)

Wheras Я ожидаю этого:

Array
(
    [0] => abababababababab
    [1] => ab
    [2] => ab
    [3] => ab
    [4] => ab
    [5] => ab
    [6] => ab
    [7] => ab
    [8] => ab
}

Как я могу получить то, что ожидаю?

(Обратите внимание, что подвыражение может быть более сложным, например, ([aA][bB]), и я хочу, чтобы соответствующие выражения в их порядке в теме.)

1 Ответ

4 голосов
/ 19 января 2009

Сделайте это, используя preg_match_all, например:

preg_match_all('/(ab)/', 'abababababababab', $matches);
print_r($matches);

Помните, что preg_match предоставляет только первое совпадение и что preg_match_all имеет те же функции, но возвращает все. Также обратите внимание, что теперь регулярное выражение изменилось. Если вы используете звездочку, она, вероятно, будет использовать всю строку при первом совпадении. Вы можете, однако, попробовать что-то вроде (ab)*?, чтобы сделать его не жадным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...