PHP 7.4 официально отвергает короткие открытые теги, а PHP 8 полностью их удаляет, поэтому этот вопрос о SO станет несколько популярным, когда люди будут искать решения для преобразования устаревших кодовых баз.
Как уже отмечалось в других ответах, sed не охватывает все варианты использования. Предлагаемый full_opening_tag
PHP-CS-Fixer очень похож на свое поведение и также не охватывает все варианты использования. Кроме того, по крайней мере один инструмент, который я нашел, такой как один ответ от danorton, в настоящее время работает только при включенных коротких открытых тегах, которые, если вы обновили до PHP 8 через обновление ОС, вы не сможете легко откатиться до 7.x для запуска такого инструменты. Caveat Emptor очень применим ко всем этим подходам.
Я написал инструмент, который не зависит от существования коротких открытых тегов (т.е. он работает с PHP 8), не использует регулярные выражения (т.е. он использует token_get_all()
), а также избегает использования коротких открытых тегов (например, <?xml
) и другие сценарии без тегов (например, строки PHP, содержащие "теги").
https://github.com/cubiclesoft/php-short-open-tag-finder/
Режим по умолчанию, в котором работает инструмент, просто находит ссылки и отображает их. Файлы не изменены.
В режиме -ask
, который в настоящее время является единственным режимом, который изменяет файлы, инструмент спрашивает, можно ли заменить каждый набор ссылок для каждого файла отдельно. То есть, если существует 500 файлов с 2 000 ссылок на короткие открытые теги, он будет запрашивать только 500 раз.
Даже при группировке на уровне файлов инструмент, возможно, слишком осторожен в своем подходе к внесению изменений. Но мы говорим о возможном изменении тысяч файлов в системе за один день. Я не думаю, что полная автоматизация является правильным ответом здесь. Мне потребовалось всего несколько часов, чтобы внимательно изучить каждое изменение, охватывающее несколько тысяч файлов во всех системах, которыми я управляю с помощью этого инструмента.
У меня довольно большой опыт использования token_get_all()
, а также написания парсеров токенов.