【问题标题】:How do i convert php short tag to full one [duplicate]我如何将php短标签转换为完整标签[重复]
【发布时间】:2011-04-06 15:26:56
【问题描述】:

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

那么哪条路更好:

  1. 转换所有短标签?

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

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

【问题讨论】:

标签: php shorttags


【解决方案1】:

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

【讨论】:

  • 或任何其他优秀的 IDE,例如 NetBeans。
【解决方案2】:

可以使用 http://php.net/manual/en/function.token-get-all.php 编写转换。与 find&replace 不同,这不会影响 XML 声明等。 转换与启用 ST:这取决于。许多程序员可能更喜欢 https://meta.stackoverflow.com/of“标准”方式的重要性视情况而定。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      对于其他人来说,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'
      

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

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

      【讨论】:

        【解决方案5】:

        一定要更换标签。

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

        【讨论】:

        • “肯定会重新调整标签”你能详细说明你的推理吗?
        • 短标签被弃用是有充分理由的——它们在别处被用于其他目的
        • 这有待商榷。 “在其他地方用于其他目的”是什么意思?
        【解决方案6】:

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

        【讨论】:

        • 在我的博客上,我发布了一个更完整的版本,其中包含 cmets 和保留 = 标签的选项,仅更改 danielnorton.com/2010/09/1079/…
        猜你喜欢
        • 1970-01-01
        • 2016-09-19
        • 2011-10-28
        • 2011-12-21
        • 1970-01-01
        • 2016-03-17
        • 2017-05-07
        • 1970-01-01
        • 2020-05-29
        相关资源
        最近更新 更多