我要编辑另一个在他的脚本中到处使用php短标签的人的项目。我在服务器上禁用了短标签。我认为转换所有短标记而不是在我的服务器中启用短标记是更好的方法。
那么哪条路走得更好:
发布于 2010-09-01 06:42:59
转换可以使用http://php.net/manual/en/function.token-get-all.php编写。与查找和替换不同,这不影响XML声明等等。转换与启用ST:这取决于。许多程序员可能更喜欢https://meta.stackoverflow.com/of“标准”-way取决于情况。
发布于 2010-09-01 06:55:57
对于其他人来说,KoolKabin指的是使用<?
而不是<?php
作为php代码的开始标记,通常以这种缩写形式使用:
<?= $myvar1, $myvar2 ?>
这相当于:
<? echo $myvar1, $myvar2 ?>
当服务器使用short_open_tag = on在php.ini中这样配置时,这本身就等同于此:
<?php echo $myvar1, $myvar2 ?>
就我个人而言,我会转换所有的短标签,除非有许多网页只有短标签。
围绕全部()编写一些代码是最安全的选择(正如我在这里详细介绍的那样),但是您可能可以使用一个简单的sed脚本:
sed -e 's/<?\([ \t\r]\)/<?php\1/g' \
-e 's/<?$/<?php/g' \
-e 's/<?=\([ \t\r]\)\?/<?php echo \1/g'
只需注意代码中的字符串(特别是正则表达式),这些字符串的<?
序列后面可能是空格字符。还请参阅:用于sed的有用的一行脚本,其中指出sed语法各不相同,而且有些不支持\t
代码(但可以输入实际的选项卡字符)。
n.b.请注意,sed不使用Perl regexes,而且这里至少有一个其他回复具有无效的sed语法:例如,Perl中的\?
是一个字面问号,但他打算使用?
,这是sed中的一个字面问号。(他还将<?=
替换为<?php
,错误地省略了“echo”。)
发布于 2010-09-01 19:56:36
我看了看更多,我修改了我先前的答案:“绝对转换它”。下面的PHP转换器很简单.确保您在上面运行的系统配置了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;
}
}
https://stackoverflow.com/questions/3615531
复制相似问题