Используя регулярные выражения PHP 5.5+, я хотел бы использовать именованные обратные ссылки для захвата группы.
Например, я хотел бы, чтобы следующие тексты соответствовали:
1-1
2-2
но не следующее
8-7
Однако когда я пытаюсь использовать обратные ссылки, PHP помечает его как найденное совпадение:
/* This statement evaluates to 1 */
preg_match("/(?<one>[1-9])\-(?<two>\\g<one>)/", "8-7");
Есть ли обходной путь для этого, кроме использования нумерованных ссылок?
Смотрите этот отрывок из PCRE документация:
Для совместимости с Oniguruma, синтаксис не Perl
\g
с последующим
имя или число, заключенные либо в угловые скобки, либо в одинарные кавычки,
альтернативный синтаксис для ссылки на подшаблон как
подпрограмма, возможно, рекурсивно.Обратите внимание, что
\g{...}
(Синтаксис Perl) и\g<...>
(Синтаксис Онигурума)
не синоним Первый является обратной ссылкой; последний является
вызов подпрограммы.
Используя \g<one>
, вы ссылаетесь не на совпадение, а на подшаблон, см. объяснение на regex101.com.
\g<one>
рекурсивно подшаблонone
Вам нужно использовать \1
фактически соответствовать тому же тексту, захваченному в первой группе.
(?<one>[1-9])\-(?<two>\1)
Или (именованная обратная ссылка на фактический текст),
(?<one>[1-9])\-(?<two>\g{one})
\1
соответствует тому же тексту, что и последний найденный при первом захвате
группа
Увидеть пронумерованное демо и именная обратная ссылка демо.
Других решений пока нет …