Как мне преобразовать php короткий тег в полный
Я должен отредактировать проект другого парня, который использовал php short tag везде в своем скрипте. У меня отключен шорт-тег на моем сервере. Я думаю, что лучше конвертировать все короткие теги вместо включения коротких тегов на моем сервере.
Так какой путь пойти лучше:
Конвертировать все короткие теги?
Включение короткого тега на моем сервере?
Как преобразовать все короткие теги в полный пакетный
6 ответов
Преобразование может быть написано с использованием http://php.net/manual/en/function.token-get-all.php. В отличие от поиска и замены, это не влияет на объявления XML и так далее. Конвертация против включения ST: Это зависит. Многие программисты, вероятно, предпочитают Php <<, поэтому, когда вы конвертируете, ваш код будет более "стандартным". Однако важность https://meta.stackru.com/of "стандартного" пути зависит от ситуации.
Для других, KoolKabin имеет в виду использование <?
вместо <?php
в качестве вводного тега для кода php, обычно используется в этой сокращенной форме:
<?= $myvar1, $myvar2 ?>
Что эквивалентно этому:
<? echo $myvar1, $myvar2 ?>
Что само по себе эквивалентно этому, когда сервер настроен так, что short_open_tag = on в php.ini:
<?php echo $myvar1, $myvar2 ?>
Лично я бы конвертировал все короткие теги, если только на многих страницах нет только коротких тегов.
Написание некоторого кода вокруг token_get_all() - ваша самая безопасная ставка (как я подробно опишу в отдельном ответе здесь), но вы могли бы уйти с помощью простого сценария sed:
sed -e 's/<?\([ \t\r]\)/<?php\1/g' \
-e 's/<?$/<?php/g' \
-e 's/<?=\([ \t\r]\)\?/<?php echo \1/g'
Просто остерегайтесь строк в вашем коде (особенно регулярных выражений), которые могут иметь <?
последовательность, за которой следует символ пробела. Смотрите также: Полезные однострочные скрипты для sed, где указано, что синтаксис sed различается, и что некоторые не поддерживают \t
код (но вы можете ввести фактический символ табуляции).
Обратите внимание, что sed не использует регулярные выражения Perl, и по крайней мере один из других ответов здесь имеет недопустимый синтаксис sed: например, \?
в Perl это буквальный знак вопроса, но он намерен ?
, который является буквальным знаком вопроса в седе. (Он также заменяет <?=
с <?php
, неправильно опуская "эхо".)
Я посмотрел немного больше и изменил свой предыдущий ответ на: "определенно преобразовать его". Это легко сделать с помощью конвертера PHP-CLI ниже. Убедитесь, что система, на которой вы работаете, настроена с short_open_tag=on
,
#!php-cli
<?php
global $argv;
$contents = file_get_contents($argv[1]) or die;
$tokens = token_get_all($contents);
$tokens[] = array(0x7E0F7E0F,"",-1);
foreach($tokens as $ix => $token) {
if(is_array($token)) {
list($toktype, $src) = $token;
if ($toktype == T_OPEN_TAG) {
if (($src == "<?") && ($tokens[$ix+1][0] != T_STRING)) {
$src = "<?php";
if ($tokens[$ix+1][0] != T_WHITESPACE) {
$src .= " ";
}
}
}
else if($toktype == T_OPEN_TAG_WITH_ECHO) {
$src = "<?php echo";
if($tokens[$ix+1][0] != T_WHITESPACE) {
$src .= " ";
}
}
print $src;
}
else {
print $token;
}
}
Вы можете попробовать использовать Eclipse PDT, используя его поиск и заменить все в проекте (CTRL + H), чтобы заменить все короткие теги полными тегами.
Изменение конфигурации сервера, вероятно, будет быстрее. Лично я не стал бы искать и заменять, потому что, хотя я предпочитаю использовать обычные теги, это просто вопрос вкуса. Короткие теги, конфликтующие с объявлениями XML, не являются серьезной проблемой, так как вы можете просто поместить объявления в строки.
Определенно переназначить теги.
Если ваш код в Unix/Linux/posix, то что-то вроде:
find ${BASEDIR} -iname \*.php -exec rep_sht_tags.sh {} \;
где rep_sht_tags.sh содержит что-то вроде:
#!/bin/bash
destdir=`dirname $1`
mkdir -p /backup/${destdir}
cp $1 /backup/$1
sed 's/<\?=/<?php /' /backup/$1 >$1
(NB не проверено)