【PHP程序高效率过滤非法内容的问题】-- 有类似问题请进来讨论,顶有分!

黑夜路人
博客专家认证
2006-01-16 06:41:05

项目是一个社区,需要做关键字过滤,主要就是过滤一些非法关键字,有关键字列表,每行一条,两千条左右,现在在用户提交文章的时候,对内容进行过滤,判断是否包含这些字符。

个人思路如下:


[ 精确匹配 ]

1. 把字符串进行去除空白,防止ASC中1-20的控制字符出现
2. 把文件读出来成为数组,使用排序函数进行排序,编码是UTF-8或GBK
3. 使用二分法对数组进行遍历,以最快的速度找到是否存在非法字符


[ 模糊匹配 ]

1. 把字符串进行去除空白,防止ASC中1-20的控制字符出现
2. 把文件读出来成为数组,使用排序函数进行排序,编码是UTF-8或GBK
3. 使用二分法对数组进行遍历,以最快的速度找到是否存在非法字符
4. 先正向匹配一次,就是让用户输入内容跟关键字列表进行匹配,然后再反向匹配一次,就是让关键字列表跟用户输入内容进行匹配


思路不知道对不对,反正目前是这么想的。


[ 问题 ]

问题1: 采用文本直接存储的方式速度是否足够快,一行一条太慢,同时可能以后会增加。是否需要使用B+树的方式来存储成二进制的,或者使用多重索引来存储。

问题2:遍历文件的话,采用何种算法比较合适,如果是文本文件,直接使用遍历数组的方式是否效率足够高?还是使用二分法或者其他算法,但是使用二分法必须先排序,排序的话涉及到关键字列表的编码问题,因为文件原来是GBK,转码后是UTF-8。

问题3:使用什么字符串匹配方式比较好?strcmp、strstr、strpos、或者mb_strpos,或者是直接==,或者使用正则,正则是使用ereg好还是preg_match好,那个效率高?

问题4:请大家讨论下存储方式和搜索方式,当然,不要涉及到太深,不要涉及到分词之类的,毕竟没有那么复杂。


很久没发贴,请大家一起讨论,谢谢,分不够再加,偶有的是分,呵呵!!


...全文
570 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
knifewolf88 2006-01-20
  • 打赏
  • 举报
回复
mark
uuq 2006-01-19
  • 打赏
  • 举报
回复
如果发现有这个字就不插入数据库
上面我发回贴csdn就是不行了所以我空了格
uuq 2006-01-19
  • 打赏
  • 举报
回复
if(preg_match("/六 合 彩/",$_POST[message]))
{
$insert=false;
}
jimmyxc 2006-01-19
  • 打赏
  • 举报
回复
up一下
Meteorlet 2006-01-19
  • 打赏
  • 举报
回复
乱用数据结构的知识
acsheva 2006-01-19
  • 打赏
  • 举报
回复
楼主能不能介绍一下你的数据量有多大,因为我如果不是十分巨大的,没什么必要进行这些负责的运算,这样做反而会增加服务器的负担。合适的就好
xxrl 2006-01-19
  • 打赏
  • 举报
回复
mark一下
YT7260 2006-01-18
  • 打赏
  • 举报
回复
楼上的,这种用JS没意义,关闭JS就无效了,必须服务端检测
黑夜路人 2006-01-17
  • 打赏
  • 举报
回复
to adouggy(李雅子) :

你所谓的hash表法如何实现?是把整个文本文件进行hash还是把单个字符串hash?
axolo 2006-01-17
  • 打赏
  • 举报
回复
发一个UBB的解析函数上来或许有用哦

function JsUBB(str)
{

// 以下为十五工作室扩展UBB

str=str.replace(" ","    "); //四个空格
str=str.replace("<","<");
str=str.replace(">",">");
str=str.replace("\n","<br>"); //回车换行
str=str.replace("\r","<br>"); //回车
str=str.replace("\t","        "); //table

//以下为标准UBB

var re=/\[i\](.[^\[]*)\[\/i\]/gi;
str=str.replace(re,"<i>$1</i>"); //斜体字
re=/\[b\](.[^\[]*)\[\/b\]/gi;
str=str.replace(re,"<b>$1</b>"); //粗体字
re=/\[u\](.[^\[]*)\[\/u\]/gi;
str=str.replace(re,"<u>$1</u>"); //下划线
re=/\[color=(.[^\[]*)\](.[^\[]*)\[\/color\]/gi;
str=str.replace(re,"<font color=$1>$2</font>"); //字体颜色
re=/\[size=([1-7])\](.[^\[]*)\[\/size\]/gi;
str=str.replace(re,"<font size=$1>$2</font>"); //字体大小
re=/\[face=(.[^\[]*)\](.[^\[]*)\[\/face\]/gi;
str=str.replace(re,"<font face=$1>$2</font>"); //字体

re=/\[center\](.[^\[]*)\[\/center\]/gi;
str=str.replace(re,"<div align='center'>$1</div>"); //居中
re=/\[right\](.[^\[]*)\[\/right\]/gi;
str=str.replace(re,"<div align='right'>$1</div>"); //右对齐
re=/\[quote\](.[^\[]*)\[\/quote\]/gi; //引用
str=str.replace(re,"<table bgcolor='#E6FFE6' width='90%' style='border:1px #009900 dotted' align='center'><tr><td class='td1'>$1</td></tr></table>");

re=/\[fly\](.*)\[\/fly\]/gi; //飞行
str=str.replace(re,"<marquee width=90% behavior=alternate scrollamount=3>$1</marquee>");
re=/\[move\](.*)\[\/move\]/gi; //移动
str=str.replace(re,"<MARQUEE scrollamount=3>$1</marquee>");
re=/\[SHADOW=*([0-9]*),*(#*[a-z0-9]*),*([0-9]*)\](.[^\[]*)\[\/SHADOW]/gi; //阴影
str=str.replace(re,"<table width=$1><tr><td style='filter:shadow(color=$2, strength=$3)'>$4</td></tr></table>");
re=/\[GLOW=*([0-9]*),*(#*[a-z0-9]*),*([0-9]*)\](.[^\[]*)\[\/GLOW]/gi; //外发光
str=str.replace(re,"<table width=$1 ><tr><td style='filter:glow(color=$2, strength=$3)'>$4</td></tr></table>")

re=/\[URL\](.[^\[]*)\[\/URL\]/gi;
str=str.replace(re,"<a href='$1' target=_blank>$1</a>"); //超链接1
re=/\[URL=(.[^\[]*)\](.[^\[]*)\[\/URL\]/gi;
str=str.replace(re,"<a href='$1' target=_blank>$2</a>"); //超链接2

re=/\[EMAIL\]([\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+)\[\/EMAIL\]/gi;
str=str.replace(re,"<a href='mailto:$1'>$1</a>"); //电子邮件链接1
re=/\[EMAIL=([\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+)\](.[^\[]*)\[\/EMAIL\]/gi;
str=str.replace(re,"<a href='mailto:$1'>$4</a>"); //电子邮件链接2

re=/\[img\](.[^\[]*)\[\/img\]/gi;
str=str.replace(re,"<a href='$1' target=_blank><img src='$1' border='0' alt='单击在新窗口浏览'></a>"); //图片
re=/:em(\d{1,}):/gi;
str=str.replace(re,"<img src='emot/$1.gif' border='0'>"); //表情图标

return str;
}
axolo 2006-01-17
  • 打赏
  • 举报
回复
用PHP么,这可是服务器端脚本!!!
你不怕你的服务器太累啊??
这种功能用JAVASCRIPT等客户端脚本来实现比较好。

算法可以讨论,实现就用JS吧。
十五刚开始学做程序员,如果话有不当就当放屁!

不知道CSDN会不会把“放屁”给咔嚓了:P
创造奇迹9999 2006-01-17
  • 打赏
  • 举报
回复
UP
xuzuning 2006-01-17
  • 打赏
  • 举报
回复
把一个简单的问题想的太复杂了

无论怎样做都需要检查每一个关键字是否包含在文件中
由于不分词,所以也就不存在优化查询的问题

$contents = str_replace($关键字数组, '', $contents);
zairwolft 2006-01-17
  • 打赏
  • 举报
回复
惭愧,二分法还不懂。都是用数组进行操作的。
-神仙- 2006-01-17
  • 打赏
  • 举报
回复
关键字列表排序,反正也很少去改,第一次就让程序排好,以后就不用了。
另外,你的关键字是什么样的东西
adouggy 2006-01-16
  • 打赏
  • 举报
回复
如果用hash表呢?先将被检测项和准备过滤的关键字的hash表示匹配一下,这样可以排除许多可能,然后再测匹配的...这样是否能降低复杂度?
ice_berg16 2006-01-16
  • 打赏
  • 举报
回复
编码转换的问题到不难解决,用iconv或网上提供的程序即可做到。
数据量大的话用二分法速度肯定比数组快,不过要先排序

正则用preg_match在效率上要高于ereg(手册上是这么说的,没测试过)

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧