экранирование "<? php" и "?>" при выводе в файл - nowdoc / heredoc - PullRequest
2 голосов
/ 26 января 2011

То, что я пытался сделать (и мог, фактически, но только на моем локальном тестовом сервере), это вывести php-файл с php.
Кажется, проблема в открывающих и закрывающих тегах php.
Я посмотрел nowdoc в php.net, но не смог найти ключ к решению. Если я использую это так:

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

Я получаю сообщение об ошибке:

Ошибка разбора: синтаксическая ошибка, неожиданный T_SL в /home/ua000154/public_html/test.php в строке XX

Номер белья этой ошибки синтаксического анализа всегда находится там, где находится открывающий php-тег. Кажется, моя проблема в том, что мне нужно экранировать этот тег (я полагаю, что я должен сделать то же самое с закрывающим тегом)

Как я мог это сделать? На самом деле это работало на моем тестовом сервере, но не после того, как я загрузил его в окончательное расположение на другом сервере.

Любая помощь приветствуется. Спасибо за ваше время!

Ответы [ 2 ]

4 голосов
/ 26 января 2011

Если вы намеренно используете синтаксис NOWDOC, убедитесь, что ваш сервер PHP работает под управлением 5.3 или более поздней версии , поскольку именно тогда он был представлен. (Вы можете проверить, используя phpinfo();). Это объясняет, почему это работает на вашем сервере разработки, а не на производстве.

1 голос
/ 19 сентября 2012

Хорошо, так что это старый вопрос, на который дан ответ, однако он может быть полезен всем, кто хочет реализовать концепцию, аналогичную NOWDOC в более ранних версиях php. он использует буферизацию вывода для точного захвата текста из исходного файла, без разбора переменных и т. д., т. е. не очень полезен, если вы хотите вставить переменные, но вы можете буквально поместить в него что угодно, если только он не содержит символов "?>", что завершает его.

обратите внимание, что он отличается от HEREDOC и NOWDOC, которые использовали >>> TERMINATOR и >>> 'TERMINATOR' тем, что переменная определяется после документа.

<?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."]";

?>
...