我要编辑另一个在他的脚本中到处使用 php 短标签的人的项目。我的服务器中禁用了短标签。我认为转换所有短标签而不是在我的服务器中启用短标签是更好的选择。
那么哪种方式更好:
转换所有短标签?
在我的服务器中启用短标签?
如何将所有短标签批量转换为完整标签
可以使用http://php.net/manual/en/function.token-get-all.php编写转换。与 find&replace 不同,这不会影响 XML 声明等。转换与启用 ST:这取决于。许多程序员可能更喜欢 <?php 而不是 <?,所以当你转换时,你的代码会更“标准”。但是,“标准”方式的重要性https://meta.stackoverflow.com/取决于具体情况。
对于其他人来说,KoolKabin 指的是使用 of<?
而不是<?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'
请注意代码中的字符串(特别是正则表达式),这些字符串可能具有<?
后跟空格字符的序列。另请参阅: sed 的有用单行脚本,其中指出sed语法各不相同,并且有些不支持该\t
代码(但您可以输入实际的制表符)。
注意sed不使用 Perl 正则表达式,并且此处至少有一个其他回复具有无效的sed语法:例如\?
,在 Perl 中是一个文字问号,但他打算,这是sed?
中的一个文字问号。(他还替换为,错误地省略了“回声”。)<?=
<?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
(注:未测试)