0

下面的代码是我的 php 网页顶部的示例代码。在特定位置输出了 php 变量。

我想实现一个 HTML 到 PDF 的转换器,但它要求我将所有代码放入 PDF 转换器将在其类中使用的单个变量中。我如何将现有的变量放入单个变量中说:$html无需打开所有 PHP 变量、转义所有内容并连接整个地方?我正在考虑使用heredoc语法,但它不喜欢, <?php ?>而且我有点困惑,因为我过去从未使用过它。关于如何实现这一目标的任何想法?

理想情况下,这就是我想做的:

$html = <<<EOD
<div id="topHeaderView"><?php echo configuration::getValue(6); ?></div>
  <table>
   <tr>
     <td><?php echo $lang["FAI_R"]["PRT"]["TITLE"]["HEADER"]; ?></td>
   </tr>
EOD;

上面没有捕获由 $lang["FAI_R"]["PRT"]["TITLE"]["HEADER"] 或输出的任何值configuration::getValue(6)

其中:

$html = "";
$html .= "<div id=\"topHeaderView\">".configuration::getValue(6)."</div>";
$html .= "<table>";
$html .= "<tr>";
$html .= "<td>".$lang["FAI_R"]["PRT"]["TITLE"]["HEADER"]."</td>";
$html .= "</tr>";

这是我想避免的...

4

4 回答 4

0

据我在手册中看到的,不可能在 HEREDOC 中调用函数。一个不太麻烦的解决方案是:

$config_print = configuration::getValue(6);
$lang_print = $lang["FAI_R"]["PRT"]["TITLE"]["HEADER"];

$html = <<<EOD
<div id="topHeaderView">$config_print</div>
  <table>
   <tr>
     <td>$lang_print</td>
   </tr>
EOD;

编辑:或者你可以使用:

$html = <<<EOD
<div id="topHeaderView"><?= _( configuration::getValue(6) ); ?></div>
  <table>
   <tr>
     <td><?= _( $lang["FAI_R"]["PRT"]["TITLE"]["HEADER"] ); ?></td>
   </tr>
EOD;
于 2013-06-20T14:12:46.317 回答
0

heredoc是 php 语法,因此它需要在 php 标签内。此处的 php 文档解释了heredoc字符串中变量的行为:

Heredoc 文本的行为就像一个双引号字符串,没有双引号。这意味着不需要对heredoc 中的引号进行转义... 变量被扩展,但是在heredoc 中表达复杂变量时必须像使用字符串一样小心。

文档中也有一些示例。

<?php

$value = configuration::getValue(6);
$header = $lang["FAI_R"]["PRT"]["TITLE"]["HEADER"];

$html = <<<EOD
<div id="topHeaderView">$value</div>
 <table>
  <tr>
   <td>$header</td>
    </tr>
EOD;

?>
于 2013-06-20T14:20:57.900 回答
0

该手册有一整章专门介绍 PHP 提供的各种字符串语法(迄今为止已有 4 章)。您基本上缺少字符串插值:

$html = <<<EOD
<div id="topHeaderView">$value</div>
 <table>
  <tr>
<td>{$lang["FAI_R"]["PRT"]["TITLE"]["HEADER"]}</td>
    </tr>
EOD;

小提琴

然而,事情并没有那么简单。您正在使用 PHP 生成另一种语言 (HTML) 的代码,您需要确保生成的代码有效。因此你不能注入随机的东西。为了在 HTML 中插入文字文本,您需要使用htmspecialchars()。变量插值需要变量,而不是函数。因此,heredoc 语法在这里几乎没有优势。连接将是一个更简单的选择:

$html = '<div id="topHeaderView">' . htmlspecialchars($value) . '</div>
 <table>
  <tr>
<td>' . htmlspecialchars($lang["FAI_R"]["PRT"]["TITLE"]["HEADER"]) . '</td>
    </tr>';

你说你不要逃避和连接。我理解你。这就是为什么复杂的 HTML 生成通常依赖于模板引擎。找到一个或建立自己的。

于 2013-06-20T14:31:48.067 回答
0

这是输出缓冲的一个很好的用途

ob_start();
?><div id="topHeaderView"><?php echo configuration::getValue(6); ?></div>
<table>
    <tr>
        <td><?php echo $lang["FAI_R"]["PRT"]["TITLE"]["HEADER"]; ?></td>
    </tr>
<?php
$html = ob_get_clean();
于 2013-06-20T14:31:57.377 回答