А есть это:
$pattern = "/\b(?:(one|two|three|four|five|(?:s|z)ix|seven|eight|nine|zero|twelve)(?:\s|-)*){4,8}/ix";
$subject = "one four-six nine twelve
zero eight nine nine seven three six six";
$matches = [];
preg_match_all ($pattern, $subject, $matches, PREG_SET_ORDER);
То, что я хочу видеть, это все отдельные слова в $matches
но я получил только девять за первое и шесть за второе — последние слова большого паттерна. Я знаю, что могу заключить все отдельные слова в квадратные скобки, но есть ли более хороший способ + таким образом я получу пустые строки
Вывод как:
array (size=2)
0 =>
array (size=2)
0 => string 'one four-six nine twelve
zero eight nine ' (length=46)
1 => string 'one'
2 => string 'four'
3 => string 'six'
4 => string 'nine'
5 => string 'twelve'
6 => string 'zero'
7 => string 'eight'
8 => string 'nine'
1 =>
array (size=2)
0 => string 'nine seven three six six' (length=24)
...
Изменил код, чтобы соответствовать всем вашим номерам и добавил именованную группу под названием число:
<?php
$pattern = '/\b(?<number>one|two|three|four|five|(?:s|z)ix|seven|eight|nine|zero|twelve)(?:\s|-)/';
$subject = "one four-six nine twelve
zero eight nine nine seven three six six";
$matches = [];
preg_match_all ($pattern, $subject, $matches, PREG_SET_ORDER);
print_r($matches);
?>
Это имеет двенадцать (все) результаты. Посмотреть демо на regex101.com Вот.
То, что я хочу видеть, это все отдельные слова в
$matches
но я получаю
только девять для первого и шесть для второго — последние слова большого образца.
К сожалению, так оно и есть, как указано для Репетиция:
При повторном захвате подшаблона полученное значение
подстрока, которая соответствует последней итерации.
Я знаю, что могу заключить все отдельные слова в скобки, но есть ли еще
хороший способ…
Один из подходов состоит в том, чтобы потом разделить найденные совпадения:
preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER);
foreach ($matches as &$m)
// replace $m[1] with the split match
array_splice($m, 1, 1, preg_split('/\s|-/', $m[0], 0, PREG_SPLIT_NO_EMPTY));
unset($m); // remove the reference to the last element
Это даст желаемый результат в $matches
,