我如何将php短标签转换为完整标签

时间:2010-09-01 06:32:41

标签: php shorttags

我要编辑另一个在他的脚本中到处使用php短标记的人的项目。我的服务器中禁用了短标签。我认为转换所有短标签而不是在我的服务器中启用短标签是更好的标签。

哪种方式更好:

  1. 转换所有短标签?

  2. 在我的服务器中启用短标记?

  3. 如何将所有短标签批量转换为完整标签

6 个答案:

答案 0 :(得分:4)

可以使用http://php.net/manual/en/function.token-get-all.php编写转换。与find& replace不同,这不会影响XML声明等。 转换与启用ST:取决于。许多程序员可能更喜欢<?php到<?,所以当你转换时,你的代码将更“标准”。但是,重要性https://meta.stackoverflow.com/of“标准”取决于具体情况。

答案 1 :(得分:3)

对于其他人,KoolKabin指的是使用<?而不是<?php作为php代码的开头标记,通常以缩写形式使用:

<?= $myvar1, $myvar2 ?>

这相当于:

<? echo $myvar1, $myvar2 ?>

当在php.ini中使用 short_open_tag = on 配置服务器时,这本身等同于此:

<?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'

请注意代码中的字符串(尤其是正则表达式)可能包含 <? 序列,后跟空格字符。另请参阅:Useful one-line scripts for sed,其中指出 sed 语法各不相同,有些不支持\t代码(但您可以输入实际的制表符)

n.b。请注意 sed 不使用Perl正则表达式,并且此处至少有一个其他回复包含无效的 sed 语法:例如Perl中的\?是一个文字问号,但他打算?,这是 sed 中的文字问号。 (他还用<?=替换<?php,错误地省略了“回声”。)

答案 2 :(得分:2)

我看了一点,我修改了我之前的答案:“绝对转换它”。使用下面的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;
  }
}

答案 3 :(得分:1)

您可以尝试使用Eclipse PDT,使用它的搜索并替换项目中的所有内容(CTRL + H)以使用完整标记替换所有短标记。

答案 4 :(得分:0)

更改服务器配置可能会更快。我个人不会费心去搜索和替换,因为尽管我更喜欢使用普通标签,但这只是一个品味问题。与XML声明冲突的短标签不是一个严重的问题,因为你可以将声明放在字符串中。

答案 5 :(得分:0)

绝对重新标记标签。

如果你的代码在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未经测试)