过滤器

过滤器是AKCMS3.9.5新增的高级功能,有点类似于Linux和DOS的管线操作,允许用户更加灵活的控制网站,下面通过几个应用实例了解一下:

应用1:采集内容时替换文字

数据源中常常有网站名称,如果将这些内容也一起采集的话就会贻笑大方了。过滤器这时候就派上用场了:首先创建一个过滤器(下同),规则这样写:

replace:网易汽车|某某汽车
replace:网易|某某网

然后在采集规则设置中应用这个过滤器即可。

应用2:页面HTML替换

有时候需要一个整站全局的替换,比如在两会前后把敏感词全部替换为文明用语。规则这样写:

replace:自由|文明用语
replace:民主|文明用语

然后再在相关模板的最后一行写上“<!--filter:1-->”(1代表具体的过滤器ID,下同),如果很多个模板都要过滤,可以把这一行放在一个子模板里,然后每个模板都引用这个子模板,在完成替换后<!--filter:1-->会被删除,对您的网页没有任何影响。

应用3:跨编码采集

有时候网站与待采集数据源编码不一致,导致无法采集或者采集到乱码。规则这样写:

php:gbktoutf8($input);

然后在采集规则中使用这个过滤器就可以在采集到HTML后,先做转码再分析内容和入库操作。(服务器需安装iconv组件)

应用4:同时提供两种编码的网页

假设网站是GBK的,但是rss输出希望使用UTF-8编码,如果直接输出一定会是乱码。过滤器规则这样写:

php:gbktoutf8($input);

然后在模板的最后一行写上<!--filter:1-->就可以了

应用5:伪原创之同义词替换

伪原创常见的一个思路就是同义词替换,过滤器可以实现这个需求。过滤规则中像前文说的一样的左边是原词,右边是替换后的词,中间用竖线隔开,一行一个。如果词较少,可以在显示时替换,具体做法是在模板中最后一行写上“<!--filter:1-->”;如果词较多显示时替换就慢了,建议在采集时替换,在采集规则中选择这个过滤器即可。

应用6:给商品链接加上广告代码

假设你的网站和图书有关,内容中常常有指向当当网图书购买页面的链接,用过滤器功能可以给每个链接加上广告代码,当当会为成交的订单向您支付佣金,不让这些流量白白浪费,过滤器规则这样写:

preg_replace:http:\/\/product\.dangdang\.com\/product.aspx\?product_id=([0-9]+)|http://union.dangdang.com/transfer.php?from=P-123456&ad_type=10&sys_id=1&backurl=http://product.dangdang.com/product.aspx?product_id=$1

把123456替换成您在当当联盟的ID,其他广告联盟都很类似,我抛玉引砖,大家举一反三

大家还可以用过滤器做出许多意向不到的功能,真正做到完全控制网页,不要成为CMS的奴隶。如果你有独特的用法请发信给我,我将刊登在这里,并保留您的链接。常用的过滤器实例我们都整理在这里,供大家参考,请点击浏览:http://jimifan.com/manual/filter-example.htm

最后总结一下,过滤器就像一条流水线,一个个环节依次处理内容。

具体进行什么处理由过滤规则决定,过滤规则目前分为五种:

一 替换(前缀:replace、preg_replace)

也是最常见的应用,前缀是“replace:”,后面写待替换的字符串,后面写替换后的字符串,中间用|分隔(分隔符是竖线)。替换字符串中如果有换行用 代替,如果有|用[|]代替。

如果前缀写“preg_replace:”则是正则替换,需要懂正则替换规则,一句话两句话讲不清楚,需要自己看正则表达式的手册,仅供高级用户使用,普通用户不用看这个。

二 引用其他过滤器 (前缀:include)

如果过滤器2是在过滤器1的基础上增加了几条,那不用在2的过滤规则中把1的规则重复一遍,只要写上include:1就可以了,然后在下面补充其他规则。注意:1引用2,2再引用1会造成死循环,对这种脑残情况程序不予处理,多吃核桃补补脑子。

三 调用PHP函数 (前缀:php)

过滤器中可以使用PHP函数(注意:不是PHP代码,仅仅是PHP函数而已),语法是在函数调用的前面加上“php:”,后面加上“;”,比如:

php:substr($input, 0, 10);
php:md5($input);

除了PHP内置函数之外,还可以调用AKCMS定义的函数,可用的函数列表如下:

gbktoutf8、tidylist、toutf8、fromutf8等

四 如果包含某个字符串就清空(前缀:clear)

clear:关键字

五 如果包含某个字符串就原样保留(否则就清空)(前缀:keep)

keep:关键字

不管哪一种规则都是一行一条,从上到下得执行,如果某一行是空行或不符合规则会跳过执行下一条,以#开头的行是注释,注释和规则不可以写到一行中。

创建好的规则可以在系统的许多地方使用:

一 采集相关的:

采集列表(源网页过滤、采集到的URL过滤、采集到的title过滤)、采集内容、采集到的内容

二 模板相关的:

如果对整个页面使用过滤器就在模板的最后一行写上<!--filter:1-->

也可以只对变量使用过滤器,比如变量$title可以通过这样使用过滤器:

<{akecho source=$title filter="1"}>

不但akecho可以这样,其他任何模板标签都可以通过增加一个filter="1"来使用过滤器。