如何使用数组中的数据解析html模板?

How to parse html template with data in array?

提问人:rkrathor 提问时间:11/4/2020 最后编辑:rkrathor 更新时间:11/5/2020 访问量:328

问:


我有一个html模板,我想附加一些具有数组的动态数据。 我能够使用简单的占位符解析数据,但是当涉及到在占位符中添加数组时,我找不到任何解决方案,如何做到这一点。我发现很多这样的问题,但它们是用于简单的解析,不包括数组。
<?php
class TemplateParser {

    protected $_openingTag = '{{';
    protected $_closingTag = '}}';
    protected $_emailValues;
    protected $_templateHtml = <<<HTML
<html>
<body>
<h1>Account Details</h1>
<p>Thank you for registering on our site, your account details are as follows:<br>
First Name: {{fname}}<br>
Last Name: {{lname}} </p>
<p> Address: {{address}}</p>
<ol>
    {{transaction}}

        <li> {{sn2}} - {{desc}} - {{amount}}</li>
    {{transaction}}
    </ol>
</body>
</html> 
HTML;

    public function __construct($emailValues) {
        $this->_emailValues = $emailValues; 
    }

    public function output() {
        $html = $this->_templateHtml;
        foreach ($this->_emailValues as $key => $value) { 
                $html = str_replace($this->_openingTag . $key . $this->_closingTag, $value, $html);
        return $html;
    }
}


$templateValues = array(
    'fname' => 'Rajesh',
    'lname' => 'Rathor',
    'address' => ' G-8/55',
    'transaction'=>array(
        0=>array(
                "sn2"=> 1,
                "desc"=> "row 1",
                "amount"=> "RS.1234"
            ),
        1=>array(
                "sn2"=> 2,
                "desc"=> "row 2",
                "amount"=> "RS.12345"
            )
    )
);

$templateHtml = new TemplateParser($templateValues);
echo $templateHtml->output();

我得到了这个结果。

<html>
<body>
<h1>Account Details</h1>
<p>Thank you for registering on our site, your account details are as follows:<br>
First Name: Rajesh<br>
Last Name: Rathor </p>
<p> Address:  G-8/55</p>
<ol>
    Array
        <li> {{this.sn2}} - {{this.desc}} - {{this.amount}}</li>
    Array
    </ol>
</body>
</html>

我想要这样的结果

<html>
<body>
<h1>Account Details</h1>
<p>Thank you for registering on our site, your account details are as follows:<br>
First Name: Rajesh<br>
Last Name: Rathor </p>
<p> Address:  G-8/55</p>
<ol>   
    <li> 1 - row 1 - RS.1234</li>
    <li> 2 - row 2 - RS.123</li>
</ol>
</body>
</html>

你们能帮我解决这个问题吗?

谢谢 拉杰什

php html 解析 电子邮件模板 contentplaceholder

评论

0赞 Chris Haas 11/4/2020
那里有现有的模板系统,最好切换到其中之一。否则,你真的只需要构建逻辑。您可能应该为复杂结构设置一个开始和结束语法。现在,您正在使用来表示块的开始和结束。这是有效的,但也意味着你不能下一个具有相同名称的内部结构。此外,对于每个 ,您可以尝试检查类型以猜测标量与其他标量的一些逻辑。 也是你需要弄清楚的事情。{{transaction}}key/valuethis
1赞 imposterSyndrome 11/5/2020
我花了大约 3 个月的时间构建了一个基本的模板系统,这是一份不断给予的礼物。你会花很长时间发现一个又一个问题,一个接一个的错误,并且不得不抓住一些你没有想到的东西。我并不是说不要这样做,这可能是一次有趣的学习经历。但实际上,这个轮子已经发明并流线型了,你可能会花更多的时间在上面,而不是你真正关心的,并最终希望你做了一些更有用/有趣的事情
0赞 rkrathor 11/5/2020
@ChrisHaas是的,你是对的,第一次打印后,它不会打印第二次,因为占位符不再存在。您正在谈论的模板在 Twig 中,我使用的是简单的核心 PHP,那么我如何使用它们?
1赞 Chris Haas 11/5/2020
@rkrathor,是的,那个特定的解决方案在 Twig 中。如果你想使用一个经过实战测试、经过深思熟虑的模板系统,它的功能非常非常丰富,但又不会太重,你只需要实现它,请参阅他们的安装说明。如果您有很多代码使用现有的模板系统,请引入 Twig 作为替代方案,通过配置或其他文件扩展名或其他方式。就像 jameson2012 基本上说的那样,构建一个简单的系统很容易,增加复杂性和调试边缘情况是你花费大部分时间的地方。
0赞 rkrathor 11/5/2020
@ChrisHaas,这里的想法只是通过解析一些标签来创建和 html,并且生成的 HTML 被发送到另一个其他语言的应用程序中使用。

答: 暂无答案