简单的PHP模板解析

时间:2015-03-08 03:28:17

标签: php

我想创建一个简单的PHP类来解析PHP中的基本HTML电子邮件模板。非常基本...将PHP数组传递给一个函数,该函数包含一个包含带有占位符{{var_name}}的电子邮件模板HTML的变量。 PHP数组的密钥将是模板中的变量名称;当电子邮件HTML作为电子邮件发送时,s值将是所需的输出。

我认为创建一个可以做同样事情并通过灵活加快速度的简单PHP类可能对我有用。

所以这里是电子邮件正文的一些基本示例HTML ....需要在模板中替换PHP变量值的变量用{{var_name}}

包装
<html>
<body>
<h1>Account Details</h1>
<p>Thank you for registering on our site, your account details are as follows:<br>
Username: {{username}}<br>
Password: {{password}} </p>
</body>
</html> 

在上面的示例中,需要填充2个变量。 {{username}}{{password}}

我希望能够简单地将我的Class函数传递给PHP数组,其中Array键是变量名,值是将在我的电子邮件模板中填充的值。

所以像这样的东西会被传递到我的方法/函数中来解析电子邮件模板......

$emailValues = array(
    'username' => 'My username value here',
    'password' => 'My password value here'
);

$emailHtml = new EmailParser($emailValues);


echo $emailHtml;  

看起来像这样......

<html>
<body>
<h1>Account Details</h1>
<p>Thank you for registering on our site, your account details are as follows:<br>
Username: My username value here<br>
Password: My password value here </p>
</body>
</html> 

我很好奇我怎么能最好地实现这个目标?我的主要问题是如何传入PHP数组并将其映射到变量名来进行替换。 PHP数组键将是模板中的变量名称。

4 个答案:

答案 0 :(得分:4)

它应该只是循环遍历值并在它们上使用str_replace。

以下是一个例子:

<?php
$emailValues = array(
    'username' => 'My username value here',
    'password' => 'My password value here'
);

$emailHtml = new EmailParser($emailValues);
echo $emailHtml->output();

class EmailParser {

    protected $_openingTag = '{{';
    protected $_closingTag = '}}';
    protected $_emailValues;
    protected $_emailHtml = <<<HTML
<html>
<body>
<h1>Account Details</h1>
<p>Thank you for registering on our site, your account details are as follows:<br>
Username: {{username}}<br>
Password: {{password}} </p>
</body>
</html> 
HTML;

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

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

答案 1 :(得分:3)

这两个功能应该有所帮助:

function template($string,$hash) {
    foreach ( $hash as $ind=>$val ) {
        $string = str_replace('{{'.$ind.'}}',$val,$string);
    }   
    $string = preg_replace('/\{\{(.*?)\}\}/is','',$string);
    return $string;
}

function template_file($file,$hash) {
    $string = file_get_contents($file);
    if ($string) {
        $string = template($string,$hash);
    }
    return $string;
}

答案 2 :(得分:2)

非递归解决方案:

<?php
    Class ParseTemplate
    {
        public function Email( $sTemplateName, $aPlaceholders, $aData )
        {
            $sReplacedHtml = '';
            try
            {
                if( !empty( $sTemplateName ) && !empty( $aPlaceholders ) && !empty( $aData ) )
                {
                    $iCountPlaceholders = count( $aPlaceholders );
                    $iCountData         = count( $aData );
                    if( $iCountData !== $iCountPlaceholders )
                    {
                        throw new Exception( 'Placeholders and data don\'t match' );
                    }
                    if( file_exists( $sTemplateName ) )
                    {
                        $sHtml = file_get_contents( $sTemplateName );
                        for( $i = 0; $i < $iCountData; ++$i )
                        {
                            $sHtml = str_ireplace( $aPlaceholders[ $i ], $aData[ $i ], $sHtml );
                        }
                        $sReplacedHtml = $sHtml;

                    }
                }           
            }
            catch( Exception $oException )
            {
                // Log if desired.
            }
            return $sReplacedHtml;
        }
    }

    $aPlaceholders = array( '{{username}}', '{{password}}' );
    $aData         = array( 'Why so pro', 'dontchangeme' );

    $oParser = new ParseTemplate;
    $sReplacedHtml = $oParser->Email( 'intemplate.html', $aPlaceholders, $aData );
    file_put_contents( 'outtemplate.html', $sReplacedHtml );
?>

答案 3 :(得分:0)

我已经将函数用于这种目的。

// file class.bo3.php, more about this class here: https://github.com/One-Shift/BO3-BOzon/blob/master/backoffice/class/class.bo3.php
class bo3 {
  public static function c2r ($args = [], $target) {
    foreach ($args as $index => $value) { $target = str_replace("{c2r-$index}", $value, $target); }
    return $target;
  }
}

并运行它

$emailValues = ['
  username' => 'My username value here', // in the template the code need to be "{c2r-username}"
  'password' => 'My password value here' // in the template the code need to be "{c2r-password}"
];

$template = file_get_contents("path/to/html/file")

$finishedTemplate = bo3::c2r($emailValues, $template);

如果要将代码格式从{c2r-$index}更改为{{ $index }},只需在类函数c2r()中进行更改。