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