Как использовать J модификатор в php?

Из php-документов

J (PCRE_INFO_JCHANGED) The (?J) internal option setting changes the local PCRE_DUPNAMES option. Allow duplicate names for subpatterns. 

Таким образом, J modifer позволяет дублировать имена в названных группах. См. Информацию о матче в правой части этой демонстрации.

Когда я пытаюсь проверить этот модификатор в php, он отображает нижеследующее предупреждение и не будет выводить какой-либо вывод.

 PHP Warning: preg_match_all(): Unknown modifier 'J' 

Вот мой код,

 $str = "foobarbuzxxxxx"; preg_match_all('~(?<name>foo).*?(?<name>buz)~J', $str, $match); print_r($match); 

Тогда я могу решить эту проблему, добавив модификатор J в само регулярное выражение,

'~(?J)(?<name>foo).*?(?<name>buz)~'

 $str = "foobarbuzxxxxx"; preg_match_all('~(?J)(?<name>foo).*?(?<name>buz)~', $str, $match); print_r($match); 

Вывод:

 Array ( [0] => Array ( [0] => foobarbuz ) [name] => Array ( [0] => buz ) [1] => Array ( [0] => foo ) [2] => Array ( [0] => buz ) ) 

вы видели, что name является индексом только для второй группы, а не для первой группы. Но мы определяем оба под одним именем. В этом он ясно показывает, что существуют две разные группы с тем же именем, что и name . Но в php, print_r($match['name']); печатает только вторую группу

 Array ( [0] => buz ) 

Но не первый. Зачем? Я предположил, что если мы будем делать print_r($match['name']); , он отображает оба, но не первый.

Итак, мои два вопроса относительно использования J модификатора в PHP,

  1. Почему это относится ко второй группе, а не к обоим? Если это всегда относится к последней группе, то в чем необходимость дублирования имен в группах захвата?

  2. А также, почему добавление модификатора J после разметки php отображает предупреждение ( не работает )?

  1. Поскольку массив не может содержать два равных ключа. Именно поэтому на первом месте появляется «имя», но имеет последнее значение (оно было переназначено).

  2. https://bugs.php.net/bug.php?id=47456

В настоящее время вы можете использовать только PCRE_INFO_JCHANGED с помощью (? J) в шаблоне. Я несколько раз предлагал сопроводителю, но он не принимал зависимость «J» как действительного модификатора в расширении.

Пример использования этого модификатора

 preg_match_all('/(?J)(?<string>.*)1|(?<string>.*)2|(?<string>.*)3$/', "text2\npext3", $matches, PREG_SET_ORDER); var_dump($matches); preg_match_all('/(?J)(?<string>.*)1|(?<string>.*)2|(?<string>.*)3$/', "text2\npext3", $matches); var_dump($matches); 

http://3v4l.org/fnm76#v446