我想创建一个简单的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数组键将是模板中的变量名称。
答案 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()中进行更改。