PHP对论坛帖子的过滤之海量关键字的过滤算法

jackxiang 2012-8-8 09:40 | |
初略:
array(将=>array(军,来=>array(要=>array(升=>array(级)))),美=>array(人=>array(上,痣),女=>array(陪,聊)))
这种方式可能会高一点,但不利于海量,下面有一个思路,可以参考下。

关键词过滤的程序:
   因为关键词比较多,用preg_replace效率极差,str_replace又不能有太多的关键词,strtr虽然效率比str_replace快四倍,但用于大数组效率却和str_replace比较接近,于是自己用PHP写了一个算法,觉得效率非常很不错,遂于大家分享,待程序完善后便贴出来,先占个位置

主要是思路,
对文章按字节进行遍历,然后对每个字节开始的位置进行递归匹配关键词(当然不是直接去匹配,这里做了一个技巧,是把关键词按字节的ACCSII码做为KEY分成N维数组),这样只遍历文章一次便定位出所有关键字的位置,递归部分不会减慢程序的速度,一般第一次就会被跳出,这样程序不会随关键字的数量而变慢,理论上几十万关键字和几千个个关键字速度差不多 在本机测试了下4万个关键词,替换一篇文章竟然才用0.01秒多,而str_replace 已经到了 0.4秒了,并且关键词数量越多 str_replace  时间越长。

DownLoad:


keyword.class.php 是类
example.php 是例子 和 与 str_replace的对比
badword.src.php 是关键词的文件

也可以参看:http://hi.baidu.com/actfish/item/7fc13be2431a9018585dd837

关于关键字过滤程序中发现的多层循环的改良技巧:
   for循环的嵌套是很悲观的一件事情,多层嵌套时不出错的概率基本上是0(除非你的嵌套非常简单),当你的程序里充满了return,break时,是否头疼了呢?这时候我们常常忽略了C#语言的一个重要关键字“GOTO”。大胆尝试一下吧,虽然平时不鼓励使用GOTO来进行编程的,但有时候,使用它会大大提高你的效率,多层复杂循环就是“有时候”的一个时候。

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/5472/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2012-8-8 09:43
评论列表
2012-8-10 19:33 | pkdog
顶啊
分页: 1/1 第一页 1 最后页
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]