2 回答
TA贡献1829条经验 获得超7个赞
而不是preg_splitorpreg_match我宁愿使用preg_replace_callback,因为您正在进行替换,并且替换值源自看起来最终将成为另一个类中的方法的内容。
function process_template($template, $begin = '<<', $end = '>>') {
// get $MyClass in the function scope somehow. Maybe pass it as another parameter?
return preg_replace_callback("/$begin(\w+)$end/", function($var) use ($MyClass) {
return $MyClass->get($var[1]);
}, $template);
}
这是一个可以玩的例子:https : //3v4l.org/N1p03
我认为这只是为了好玩/学习。如果我真的需要使用模板来做某事,我宁愿从头开始composer require "twig/twig:^2.0"。事实上,如果你有兴趣了解更多关于它是如何工作的,你可以去看看一个完善的系统,比如树枝或刀片。(比我在这个答案中所做的要好。)
TA贡献1783条经验 获得超4个赞
周围有大量的模板引擎,但有时......只是为一个可能简单的事情增加复杂性和依赖性。这是我用于进行一些 javascript 更正的修改示例。这适用于您的模板。
function process_template($html,$b='<<',$e='>>'){
$replace=['this'=>'<input name="this" />','that'=>'<input name="that" />'];
if(preg_match_all('/('.$b.')(.*?)('.$e.')/is',$html,$matches,PREG_SET_ORDER|PREG_OFFSET_CAPTURE)){
$t='';$o=0;
foreach($matches as $m){
//for reference $m[1][0] contains $b, $m[2][0] contains $e
$t.=substr($html,$o,$m[0][1]-$o);
$t.=$replace[$m[2][0]];
$o=$m[3][1]+strlen($m[3][0]);
}
$t.=substr($html,$o);
$html=$t;
}
return $html;
}
$html="
<div>
<<this>>
<<that>>
</div>
";
$new=process_template($html);
echo $new;
出于演示目的,我放置了$replace处理替换的数组。您可以使用将处理替换的函数替换它们。
这是一个工作片段:https : //3v4l.org/MBnbR
我喜欢这个功能,因为你可以控制替换什么以及在最终结果上放什么。顺便说一下,通过在PREG_OFFSET_CAPTURE匹配上使用也返回正则表达式组发生的位置。那些在$m[x][1]. 捕获的文本将在 上$m[x][0]。
- 2 回答
- 0 关注
- 162 浏览
添加回答
举报