【问题标题】:escaping "<?php" and "?>" when outputing to a file - nowdoc/heredoc输出到文件时转义“<?php”和“?>” - nowdoc/heredoc
【发布时间】:2011-01-26 05:59:39
【问题描述】:

我试图做的(实际上可以,但只能在我的本地测试服务器上)是用 php 输出一个 php 文件。
问题似乎是 php 的开始和结束标记。
我在 php.net 中查找了 nowdoc,但找不到解决方案的线索。 如果我这样使用它:

$fh = fopen($filenameandpath, 'w') or die("can't open file");
$stringData = <<<'WWR'
<?php
echo('test');
?>
WWR;
$suc = fwrite($fh, $stringData);
fclose($fh);

我得到一个解析错误:

解析错误:语法错误,第 XX 行 /home/ua000154/public_html/test.php 中的意外 T_SL

此解析错误的行号始终是找到开始 php-tag 的位置。我的问题似乎是我需要转义这个标签(我想我应该对结束标签做同样的事情)

我怎么能这样做?这实际上在我的测试服务器上有效,但一旦我将它上传到另一台服务器上的最终位置,它就不会了。

感谢任何帮助。感谢您的宝贵时间!

【问题讨论】:

  • 它是完整的文件吗我的意思是你在这个文件的开头添加了
  • 我会怀疑这是一个不受支持的边缘情况,但你的例子对我来说很好。你确定你的服务器运行的是 PHP>5.3 吗?
  • @shankman,是的,它是一个带有开始和结束标记 @mario 的完整文件,我刚刚注意到我的远程服务器正在运行 5.2.17,因此不支持 NOWDOC。我使用 nowdoc 因为我需要确切的字符串作为输出。现在我必须弄清楚如何转义字符串中的每个变量。你能帮帮我吗?

标签: php string escaping nowdoc


【解决方案1】:

如果您有意使用 NOWDOC 语法,请确保您的 PHP 服务器 is running 5.3 or later,因为它是在引入它的时候出现的。 (您可以使用phpinfo(); 进行检查)。这可以解释为什么它可以在您的开发服务器上运行,但不能在生产环境中运行。

【讨论】:

  • @yc 这是 nowdoc 的有效语法(引号)
  • 感谢您的快速回复。我实际上使用的是 php 字符串的单引号版本 NOWDOC。这意味着通过放置引号,不会解释 nowdoc 中的变量。我需要输出包含变量而不解释它们。
  • 啊!那是缺失的部分。远程服务器正在运行 5.2。谢谢你。如何在 heredoc 中转义 php 变量($variable)?
  • @你需要用反斜杠转义它们。即,如果$foo='bar'; 在传统的HEREDOC 中,\$foo 将显示$foo,而$foo 将显示bar
  • @大家:好的!谢谢!真的很欣赏您所有回复的速度和深度! @yc 再次感谢。难以置信的快。
【解决方案2】:

好的,所以这是一个已经回答的老问题,但是这可能对任何想要在早期版本的 php 中实现与 NOWDOC 类似概念的人有用。它使用输出缓冲从源文件中逐字捕获文本,没有任何变量解析等。也就是说,如果您想插入变量,则没有太多用处,但是您可以在其中放入任何内容,只要它不包含字符"?>",终止它。

请注意,它与使用 >>>TERMINATOR 和 >>>'TERMINATOR' 的 HEREDOC 和 NOWDOC 不同之处在于,变量是在文档之后定义的。

<?PHP

    function NOWDOC_() {
        ob_start();
    }

    function _NOWDOC(&$buf=false) {
        $buf_ = ob_get_contents();
        ob_end_clean();
        if ($buf!==false) $buf .= $buf_;
        return $buf_;
   }



   NOWDOC_(); ?>random garbage, not shown, but captured into $myvar 


   it has all sorts ] [* \%&  of characters in it

   and completely ignores things like {$this} or $_SERVER['REMOTE_ADDR';

   <?PHP _NOWDOC($myvar);





   NOWDOC_(); ?><HTML><HEAD></HEAD>

   <BODY>Here is some <B>nice</B> HTML &amp; .

     <SCRIPT>

      alert("javascript!");

     </SCRIPT>  

           this also demonstrates using $var = _NOWDOC() syntax.


   </BODY>

   </HTML><?PHP $myhtml = _NOWDOC();


   echo "the html will be [".$myhtml."]";

?>

【讨论】:

  • 刚刚意识到我没有正确允许附加到现有字符串(我的原始代码没有 $buf 参数作为可选参数,而且我对这篇文章的编辑有点太仓促了。
猜你喜欢
  • 2012-06-24
  • 2014-08-22
  • 2018-01-07
  • 2017-11-21
  • 2013-05-20
  • 2013-07-24
  • 2013-06-15
  • 2012-12-19
  • 2015-10-16
相关资源
最近更新 更多