Поиск всех коротких тегов PHP
Мне нужно найти все короткие теги PHP.
Регулярное выражение для него <\?(?!php)
, но я не могу использовать его в vim.
Как "преобразовать" его в vim?
Ответы
Ответ 1
Лучший способ найти короткие теги в vim - найти все вхождения <?
, за которыми не следует p
:
/<?[^p]
Причина, по которой ваше регулярное выражение терпит неудачу в vim, состоит в том, что /?
находит буквальные вопросительные знаки, а \?
- квантификатор; /<\?
в vim попытается найти 0 или 1 меньше знаков. Это в обратном направлении от того, что вы можете ожидать в большинстве движков регулярных выражений.
Если вы хотите совместить короткие теги, за которыми сразу следует новая строка, вы не можете использовать [^p]
, для чего требуется, чтобы там было что-то, что не соответствует p
. В этом случае вы можете сопоставить "не p или конец строки" с помощью
/<?\($\|[^p]\)
Ответ 2
Для меня это работало нормально:
<\?(?!php|xml)
Ответ 3
Правильный шаблон поиска, который вы используете, - это <?\(php\)\@!
, который будет соответствовать всем коротким тегам, кроме тех, за которыми следует php
Для более подробной информации о перспективах/за утверждениями просто введите :help \@
в vim
Ответ 4
Использование (последняя версия) grep
:
grep -P '<\?(?!(php|xml|=))' *
Чтобы найти все файлы с коротким тегом <?
:
find -type f -exec grep -IlP '<\?(?!(php|xml|=))' {} +
Обратите внимание, что они не соответствуют короткому тегу <?=
, так как это всегда доступно с 5.4.0, и это не наносит вреда ни путь. (Принимая во внимание, что <?
наносит вред, если allow_short_tags = Off
.)
Ответ 5
Найти
<\?(\s|\n)
Заменить
<?php$1
Объяснение сопоставить короткий тег <\?
, за которым следует одно пробел или новая строка (\s|\n)
и сохранить в $1
Все предоставленные решения соответствуют тому, что строка не содержит, вместо того, что будет гарантировано содержать.
Мы только хотим сопоставить короткий тег, и не волнует, что происходит после (p/x/= и т.д.). Этот поиск/замена будет соответствовать как строковым коротким тегам, так и коротким тегам новой строки.
Примечание. Если вы используете разрывы строк Windows, <\?(\s|\r\n)
будет соответствовать тем же.
Ответ 6
Небольшая модификация ответа выше...
/<?[^p\n]
Вышеуказанный ответ не соответствует открытому короткому тегу, за которым следует новая строка, которая была скрыта в некотором коде, который я смотрел, это делает...
Ответ 7
Чтобы соответствовать <?
, а не <?php
, просто используйте это как поисковый запрос в vim:
/<?[^p]
/
, чтобы начать поиск в режиме cmd
Ответ 8
Я хочу заменить все теги <?
на <?php
в PhpStorm путем поиска и замены.
Для меня это работает
находка
<\?[^p](.*)
заменить
<?php\n$1
Я использую $1
для добавления \n после тега php, иначе он заменит все sting на <?