preg_match_all - как перехватить все подшаблоны

1

A:

$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)
      ...
  • 0
    Пожалуйста, опишите ожидаемый результат.
  • 0
    Вы ищете что-то подобное ?
Показать ещё 1 комментарий
Теги:
regular-language

2 ответа

0

То, что я хочу видеть, - это все разделенные слова в $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.

0

Изменен код для соответствия всем вашим номерам и добавлена именованная группа с номером:

<?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 здесь.

  • 1
    Нет, они были сгруппированы с 4 до 8 по причине.

Ещё вопросы

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