Регулярное выражение для соответствия (1 или более) php heredocs, содержащих пустую строку - PullRequest
1 голос
/ 10 апреля 2019

Пример текста по адресу: https://regex101.com/r/tfYEkO/1

Я хочу найти heredocs в коде php, который содержит пустую строку.

Я могу сделать это с помощью этого регулярного выражения, но если есть 2 heredocsв файле это будет совпадать с начала первого до конца второго:

<<<([A-Z]+)\n.*\n\n.*\n *\1\b

Так что я думал, что отрицательные взгляды решат это, но это ничего не соответствует:

<<<([A-Z]+)\n(?!.*\1.*).*\n\n(?!.*\1.*).*\n *\1\b

Я не думаю, что смогу использовать отрицательные взгляды с .* в нем.Я попробовал флаг ungreedy, но это, похоже, не изменило его.

К вашему сведению, heredoc в php начинается с <<< и ключевого слова и заканчивается этим ключевым словом в отдельной строке:

$foo = <<<HTML
This is the string that is returned.

It can contain multiple lines.
HTML;

1 Ответ

2 голосов
/ 10 апреля 2019

Вы можете использовать

'~<<<([A-Za-z_]\w*)(?:\R(?!\1;\R).*)*\R(?:\R(?!\1;\R).*)*\R\1;\R~'

См. Демонстрационную версию regex

Чтобы сделать ее совместимой с PHP 7.3 более слабыми требованиями (закрывающий маркер теперь может иметь отступ и требование новой строки после удаления закрывающего маркера), используйте

'~<<<([A-Za-z_]\w*)(?:\R(?!\h*\1;$).*)*\R(?:\R(?!\h*\1;$).*)*\R\h*\1;$~m'

См. еще один regex demo .

Подробности

  • <<< - литерал <<< подстрока
  • ([A-Za-z_]\w*) - Группа 1: допустимая метка PHP ( должна содержать только буквенно-цифровые символы и символы подчеркиванияи должен начинаться с нецифрового символа или подчеркивания )
  • (?:\R(?!\1;\R).*)* - 0 или более повторений разрыва строки (\R), за которыми не следует то же значение, что и в группе 1, за которой следуетс ; и разрывом строки, а затем всей строкой (.*)
  • \R - разрыв строки
  • (?:\R(?!\1;\R).*)* - см. выше (обратите внимание, что в случае(?!\h*\1;$), это означает «не сопровождается 0+ горизонтальными пробелами, значением группы 1 и ; в конце строки»
  • \R - строка, нарушающаяk
  • \1 - то же значение, что и в группе 1
  • ; - точка с запятой
  • \R - разрыв строки / $ - конецстроки (с модификатором m, $ соответствует концу строки, а не концу строки).
...