Поиск всех коротких тегов 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 на <?