PHP - 使用代码解析字符串时出错

时间:2010-03-03 23:17:48

标签: php string parsing version

我遇到了一些以前在PHP 4.X中工作但在PHP 5.2.4中无法运行的代码的问题

首先,有一个类似于导致问题的代码的小例子。不幸的是,我无法通过一个小例子来重现这个问题。

<?php
class Example{

  public function showExample()
  {
    $ind = 1;
    $m   = "method";
    $str2 = "{call method}";

    $str2 = str_replace("{call $m}" , "<?php  print( \$pre$ind ); ?>", $str2);

    echo $str2 . "\n";
   }
}

$e = new Example();
$e -> showExample();
?>

这段代码正在构建一个带有一些php代码的字符串,以便稍后执行。特别是,生成的代码将打印名为“$ pre”+变量号的变量的值。在这种情况下,输出如下:

 <?php  print( $pre1 ); ?>

使用此代码,一切运行正常。问题是当我在更大的类的上下文中使用它时,这是我已经使用了很长时间的框架的一部分。我不能在这里粘贴类的整个源代码,但有问题的行如下(我简化它们以删除str_replace,但错误仍然出现):

        $myVar = "value";
        $myVar2 = 2;
        $str2 = "<?php print( \$myVar$myVar2 );  ?>";

当我加载文件时,我收到以下两条消息:

PHP Warning:  Unexpected character in input:  '\' (ASCII=92) state=1 in /Users/giove/Sites/mundial/htmltemplate.php on line 252
PHP Parse error:  syntax error, unexpected T_VARIABLE in /Users/giove/Sites/mundial/htmltemplate.php on line 252

我可以通过删除'\'来修复警告,但这会改变代码的语义,所以这不是真正的可能性。

现在,最奇怪的部分是我可以通过破坏或删除序列来删除这两个错误“

这似乎是版本的差异,但我无法在更改日志中找到任何提及。


现在我有了Cryo的工作解决方案:拆分字符串

 "<?php" 

防止其“评估”(我不确定这是否真的是评估)。

尽管如此,我仍然想知道这种奇怪行为的原因。

Cryo:感谢您的帮助,我会在几天内将问题标记为已回答。

2 个答案:

答案 0 :(得分:1)

我的猜测是PHP正在重新开启php标签<?php,尝试拆分:

$str2 = "<?" . "php print( \$myVar$myVar2 );  ?>";

或使用单引号和连接:

$str2 = '<?php print( $myVar' . $myVar2 . ' );  ?>';

答案 1 :(得分:1)

Cryo在正确的轨道上,虽然我认为实际的问题是PHP评估双引号字符串中的变量。但是,斜杠应该阻止对变量进行求值。所以:

$a = "somestring"
$b = "\$a" // -> \$a
$c = '\$a' // -> \$a

我认为你的字符串会以奇怪的方式进行评估,以便以奇怪的方式评估\ + $ myVar。