Smarty的输出过滤功能outputfilter

最近项目中遇到一个问题:
    页面显示前需要对可能出现的违禁词过滤,之前的做法是使用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一下,做积累

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值