在我花了整整一夜,尝试了上述所有答案之后,我意识到,出于某种意想不到的原因,正则表达式根本不适用于我的简单模板。他们返回垃圾或部分信息。所以我决定删除标签之间的所有内容,而不是计算标签^_^。
我的意思是,如果模板是'AAA {{BB}} CC {{DD}} {{BB}} SS'
,我只需'}}'
在模板的开头和'{{
结尾添加.... 和之间的所有内容}}
, {{
我将删除,在 => 之间添加逗号}}{{BB,}}{{DD,}}{{BB,}}{{
。然后 - 只需擦除}}
和{{
。
我花了大约 15 分钟来编写和测试....但是使用正则表达式我花了大约 5 个小时没有成功。
/**
* deletes ALL the string contents between all the designated characters
* @param $start - pattern start
* @param $end - pattern end
* @param $string - input string,
* @return mixed - string
*/
function auxDeleteAllBetween($start, $end, $string) {
// it helps to assembte comma dilimited strings
$string = strtr($start. $string . $end, array($start => ','.$start, $end => chr(2)));
$startPos = 0;
$endPos = strlen($string);
while( $startPos !== false && $endPos !== false){
$startPos = strpos($string, $start);
$endPos = strpos($string, $end);
if ($startPos === false || $endPos === false) {
return $string;
}
$textToDelete = substr($string, $startPos, ($endPos + strlen($end)) - $startPos);
$string = str_replace($textToDelete, '', $string);
}
return $string;
}
/**
* This function is intended to replace
* //preg_match_all('/\{\%\s*([^\%\}]*)\s*\%\}|\{\{\s*([^\}\}]*)\s*\}\}/i',
* which did not give intended results for some reason.
*
* @param $inputTpl
* @return array
*/
private function auxGetAllTags($inputTpl){
$inputTpl = strtr($inputTpl, array('}}' => ','.chr(1), '{{' => chr(2)));
return explode(',',$this->auxDeleteAllBetween(chr(1),chr(2),$inputTpl));
}
$template = '<style>
td{border-bottom:1px solid #eee;}</style>
<p>Dear {{jedi}},<br>New {{padawan}} is waiting for your approval: </p>
<table border="0">
<tbody><tr><td><strong>Register as</strong></td><td>{{register_as}}, user-{{level}}</td></tr>
<tr><td><strong>Name</strong></td><td>{{first_name}} {{last_name}}</td></tr>...';
print_r($this->auxGetAllTags($template));
希望它会帮助某人:)