Из 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,
Почему это относится ко второй группе, а не к обоим? Если это всегда относится к последней группе, то в чем необходимость дублирования имен в группах захвата?
А также, почему добавление модификатора J
после разметки php отображает предупреждение ( не работает )?
Поскольку массив не может содержать два равных ключа. Именно поэтому на первом месте появляется «имя», но имеет последнее значение (оно было переназначено).
В настоящее время вы можете использовать только 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);