php用$ variable的内容替换字符串中的$ variable

时间:2012-06-22 19:47:46

标签: php

在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 = file_get_contents("template.html");

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

我确实阅读了一些关于使用正则表达式和printf替换变换的帖子,但我看不出如何在我的场景中使用它们。我很肯定必须有更容易和更好的方式。

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

非常感谢任何建议。

8 个答案:

答案 0 :(得分:5)

这与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();
?>

答案 1 :(得分: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#

答案 2 :(得分:0)

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

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

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

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

答案 3 :(得分:0)

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

echo preg_replace_callback("/[$][a-zA-Z0-9]+/", function($varname) {
    return $GLOBALS[substr($varname[0], 1)];
}, $input);

答案 4 :(得分:0)

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

$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;

答案 5 :(得分: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文件中。

答案 6 :(得分:-2)

如果您使用单引号,则在混合字符串和变量时使用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

答案 7 :(得分:-2)

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

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

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

Dots在PHP中连接字符串。

应该这样做! :)