Поиск всех коротких тегов PHP - PullRequest
17 голосов
/ 24 мая 2011

Мне нужно найти все короткие теги PHP.

Регулярное выражение для него <\?(?!php), но я не могу использовать его в vim.

Как "конвертировать" его в vim?

Ответы [ 8 ]

26 голосов
/ 11 мая 2015

Для меня этот работал нормально:

<\?(?!php|xml)
16 голосов
/ 24 мая 2011

Лучший способ найти короткие теги в vim - это найти все вхождения <?, за которыми не следует p:

/<?[^p]

Причина, по которой ваше регулярное выражение терпит неудачу в vim, заключается в том, что /? находит буквальные вопросительные знаки, тогда как \? является квантификатором; /<\? в vim попытается найти 0 или 1 знак меньше. Это в обратном направлении от того, что вы могли ожидать в большинстве механизмов регулярных выражений.


Если вы хотите сопоставить короткие теги, за которыми сразу следует новая строка, вы не можете использовать [^p], для чего требуется, чтобы там было что-то для соответствия, которое не является p. В этом случае вы можете сопоставить «не p или конец строки» с

/<?\($\|[^p]\)
7 голосов
/ 01 декабря 2016

Использование (последняя версия) grep:

grep -P '<\?(?!(php|xml|=))' *

Чтобы найти все файлы с коротким тегом <?:

find -type f -exec grep -IlP '<\?(?!(php|xml|=))' {} +

Обратите внимание, что они не соответствуют короткому тегу <?=, так как всегда доступен начиная с 5.4.0, и это не наносит вреда в любом случае. (Принимая во внимание, что <? причиняет вред, если allow_short_tags = Off.)

5 голосов
/ 24 мая 2011

Правильный шаблон просмотра вперед, который вы ищете, это <?\(php\)\@!, который будет соответствовать всем коротким тегам, кроме тех, за которыми следует php

Для получения более подробной информации о взглядах вперед / назад просто введите :help \@ в vim

4 голосов
/ 13 ноября 2017

Найти

<\?(\s|\n)

Заменить

<?php$1

Пояснение соответствует короткому тегу <\?, за которым следуетодин пробел или символ новой строки (\s|\n) и сохраните в $1

Все предоставленные решения соответствуют тому, что строка не содержит, вместо того, что будет гарантированно содержать.

Мы всегда хотим соответствовать короткому тегу и не заботимся о том, что будет после (p / x / = и т. Д.).Этот поиск / замена будет соответствовать как встроенным коротким тегам, так и коротким тегам новой строки.

Примечание: Если вы используете разрывы строк в Windows, <\?(\s|\r\n) будет совпадать.

2 голосов
/ 25 августа 2011

Небольшое изменение к ответу выше ...

/<?[^p\n]

Приведенный выше ответ не соответствует открывающему короткому тегу, за которым следует новая строка, которая была скрыта в некотором коде, который я просматривал, этотделает ...

1 голос
/ 13 февраля 2015

Я хочу заменить все <? теги на <?php в PhpStorm путем поиска и замены.

Для меня это работает

найти

<\?[^p](.*)

заменить

<?php\n$1

Я использую $1 для добавления \ n после тега php, в противном случае он заменяет все строки на <?

1 голос
/ 24 мая 2011

Чтобы соответствовать <?, а не <?php, просто используйте это как условие поиска в vim:

/<?[^p]

/, чтобы начать поиск в cmd-режиме

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...