上記のすべての答えを試してかなりの夜を過ごした後、予期しない理由で、正規表現が私の単純なテンプレートではまったく機能しないことに気付きました。彼らはがらくたまたは部分的な情報を返しました。そこで、タグを数えるのではなく、タグ間のすべてのコンテンツを消去することにしました^_^。
つまり、テンプレートがの場合、テンプレートの最初と最後に'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));
それが誰かを助けることを願っています:)