最近项目中遇到一个问题:
??? 页面显示前需要对可能出现的违禁词过滤,之前的做法是使用fetch函数得到编译后的html做正则替换,因为页面不同位置需要设置不同的缓存时间,共执行了三次,导致页面耗时多了0.2s.其实在第一次坐下过滤就足够了,之后访问的都是过滤后的安全内容.
??? 翻看smarty源码可知fetch函数执行是页面已经进行了缓存.所以必须在smarty编译前过滤.
?? ?方法1:采用smarty插件的形式,在页面display或fetch之前使用load_filter函数。
?? ?例:
?
$smarty->load_filter('output','censor'); //censor为插件名字
?? ?插件代码:
?
function smarty_outputfilter_censor($source, &$smarty) { include(ROOT .'/config/Censor.php'); $source = empty($sysCensor['filter']) ? $string : preg_replace($sysCensor['filter']['find'], $sysCensor['filter']['replace'], $source); return $source; }?
这种方法不好的地方就是一旦使用该函数,之后执行的代码都会受影响。如果只想对部分页面进行过滤操作,可以使用下面这种
?
方法2:
使用smarty的register_outputfilter函数来调用自定义的过滤函数
?
$smarty->register_outputfilter(array($this->sysFun,'replaceCensor'));
?register_outputfilter的参数为array($object,$method),可以任意调用A类下面的B方法进行过滤。再使用unregister_outputfilter函数即可对范围内的页面进行过滤
?
$smarty->unregister_outputfilter(array($this->sysFun,'replaceCensor'));?
mark一下,做积累
?
?