Как мне преобразовать php короткий тег в полный

Я должен отредактировать проект другого парня, который использовал php short tag везде в своем скрипте. У меня отключен шорт-тег на моем сервере. Я думаю, что лучше конвертировать все короткие теги вместо включения коротких тегов на моем сервере.

Так какой путь пойти лучше:

  1. Конвертировать все короткие теги?

  2. Включение короткого тега на моем сервере?

  3. Как преобразовать все короткие теги в полный пакетный

6 ответов

Решение

Преобразование может быть написано с использованием http://php.net/manual/en/function.token-get-all.php. В отличие от поиска и замены, это не влияет на объявления XML и так далее. Конвертация против включения ST: Это зависит. Многие программисты, вероятно, предпочитают 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 не проверено)

Другие вопросы по тегам