2

在 PHP 中,我需要从模板生成 HTML 页面并在特定位置插入变量,然后将它们保存到磁盘。

到目前为止,这段代码运行良好:

<?php 

$client = "John doe";

$template = "

<html>
<body>
<div>
$client
</div>
</body>
</html>

";

$htmlCode = $template;

$fh = fopen("page.html", 'w') or die("can't open file");
fwrite($fh, $htmlCode);
fclose($fh);

?>

最终,我想从磁盘上的文件中啜饮并读取 $template ,使用类似的东西:

$template = file_get_contents("template.html");

但是使用这种方法,我无法将 $client 替换为“John doe”,而是在我将其保存到磁盘时在 HTML 代码中显示为 $client。

我确实阅读了一些关于使用 regex 和 printf 替换 substings 的帖子,但我看不出如何在我的场景中使用它们。我很肯定,必须有更简单更好的方法。

很多地方都需要大量变量,所以我不想为每个变量创建一个正则表达式。我只想能够在外部 html 文件中的任何位置粘贴一个 $variable,PHP 应该用变量内容替换它(如果它存在的话)。不幸的是,file_get_contents() 只是将它完全按原样吞咽成一个字符串,而没有任何解释。如果有另一个我可以用来啜饮的功能,我正在徘徊,它实际上可以像我缩进一样工作。

非常感谢任何建议。

4

8 回答 8

6

这与http://php.net/manual/en/function.ob-start.php中的一些示例代码非常相似,并且可能对您的情况有用:

<?php 
function save_callback($buffer) {
    // save buffer to disk
    $fh = fopen("page.html", 'w') or die("can't open file");
    fwrite($fh, $buffer);
    fclose($fh);
    return $buffer; // use it or ignore it
}
$client = "John doe";
ob_start("save_callback");
include("template.php");
ob_end_clean();
?>
于 2012-06-22T20:07:35.917 回答
4

我在阅读模板文件时也做了同样的事情。我的模板如下所示:

<html>
<body>
<div>{client}</div>
</body>
</html>

然后 PHP 代码将用 $client 替换“{client}”。

$template = file_get_contents("template.html");
$contents = str_replace("{client}", $client, $template);

在模板中使用您想要的任何分隔符: %client% [client] ?client? #client#

于 2012-06-22T20:05:36.650 回答
1

这很简单,只需编写以下内容:

$html = file_get_contents('0.txt');
// or user is:
$html = '&lt;html&gt;&lt;body&gt;$DATA&lt;/body&gt;&lt;/html&gt;'; 
// remember us single quotation (') not double quotation (&quot;) for a string
$DATA = &quot;&lt;h1&gt;Hi&lt;/h1&gt;&quot;;
eval(&quot;\$html = \&quot;$html\&quot;;&quot;);
echo $html;
于 2017-01-16T20:52:18.257 回答
0

您可以使用一个简单的正则表达式:

$out = preg_replace_callback("/\$([^\s]+)/",
    function($m) {
        if( isset($GLOBALS[$m[1]]))
            return $GLOBALS[$m[1]];
        else return $m[0];
    },
    $in);

它并不完美,因为它是一个非常幼稚的正则表达式,但在大多数情况下它会做你想做的事。

就个人而言,对于模板,我会使用{%keyword}更容易分隔的东西。

于 2012-06-22T19:52:29.200 回答
0

在这种情况下,我只匹配纯字母数字变量名。

echo preg_replace_callback("/[$][a-zA-Z0-9]+/", function($varname) {
    return $GLOBALS[substr($varname[0], 1)];
}, $input);
于 2012-06-22T20:13:44.200 回答
0

如果可能,我会改用 cURL。就像在 Javascript 中使用 AJAX 一样,您可以在 cURL 中请求一个带有 POST 变量的 php 页面。

在你的情况下,你可以创建这样的东西......

// Variables
$client = "John doe";
$your_template_url = "http://UseYourURL.com";


// cURL
$ch = curl_init($your_template_url);
curl_setopt($ch, CURLOPT_POSTFIELDS, ["client" => $client ]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$htmlCode = curl_exec($ch);    
curl_close($ch);


// Write into the file
$fh = fopen("page.html", 'w') or die("can't open file");
fwrite($fh, $htmlCode);
fclose($fh);

在您的模板中,您应该有类似...

<html>
   <body>
      <div>
         <?php echo $_POST['client']; ?>
      </div>
   </body>
</html>

确保您的模板是 php 文件,而不是 html。即使您想要 html 代码,您仍然需要 php 将您的变量回显到 html 文件中。

于 2019-03-15T17:27:29.260 回答
-1

如果您使用单引号,则在混合字符串和变量时在 php 上:

   $name = "john";
   echo 'The Name is $name';
   // will output: The Name is $name

但是如果你使用双引号:

    echo "The Name is $name";
    // will output: The Name is john
于 2012-06-22T19:51:39.317 回答
-3

我相信这是因为您将变量写在双引号内。双引号内的所有内容都将按照它们在代码中的编写方式逐字转换为字符串。

在你的例子中,为了得到你想要的结果,当你声明 $template 变量时,你应该将它与你想要添加到它的值连接起来,如下所示:

$template = "
<html>
<body>
<div>" . $client . "</div>
</body>
</html>
";

点连接 PHP 中的字符串。

这应该够了吧!:)

于 2012-06-22T19:58:05.413 回答