过滤器

作者: zms! 日期: 2014.03.17 本文发布于2204天前 分类: 使用手册 相关:

应用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的奴隶。如果你有独特的用法请发信给我,我将刊登在这里,并保留您的链接。常用的过滤器实例我们都整理在这里,供大家参考,请看本页底部实例 

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

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

一 替换(前缀: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内置函数之外,还可以调用ZMS定义的函数,可用的函数列表如下: 

gbktoutf8、tidylist、toutf8、fromutf8等

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

clear:关键字

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

keep:关键字

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

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

一 采集相关的: 

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

二 模板相关的: 

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

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

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

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


实例:

1 删除某一区域的内容,假设要删除的内容包含在<div class="page-Article-QQ" id="ArtPLink" bossZone="artPage">与</div>中
preg_replace:<div class="page-Article-QQ" id="ArtPLink" bossZone="artPage">(.*)<\/div>|

2 清理HTML中的多余的空行、空格
php:clearhtml($input);

3 清除前后的空格、空行
php:trim($input);

4 清除HTML中的标签,除了<p><img><b>
php:strip_tags($input,'<b><img><p>');

或换成自己需要保留的标签,比如:

<p><img><strong><table><tr><td>

5 将HTML转换为TEXT,删除全部标签
php:htmltotext($input);



返回上一页


讨论区

您尚未 登录,或请 注册

登 录 注 册


你可能也喜欢

站群功能 2017.05.25,2 pv
ZMS使用授权 2017.04.22,45 pv
后台应用WebApp 2017.04.21,42 pv

常用标签用法一览 2016.04.29,168 pv
常用自定义变量和函数 2015.10.11,42 pv
开启61位URL格式 2015.06.05,22 pv