现在大多数管理系统/网站 都会用到一个功能模块《关键词过滤》,没有好像就显得你不专业似的,因为项目中也需要所以就写了一个简单的算法,记录一下他的实现原理(代码中不写过多的注释了,单独体现在小标题上)
核心概念:把传递过来的数据解析,与指定的词语比对
理解以后就是这么简单
1.如果每一次都需要单独请求数据库会造成访问量过大对服务器的负担也是较大的,所以只会在第一次加载时发送请求,并将数据放到localStroage中去
// 敏感词存储变量
var sensitveWords;
if(localStorage.getItem("sensitiveWords")){
sensitveWords = eval("("+localStorage.getItem("sensitiveWords")+")");
}
init();
function init(){
if(!localStorage.getItem("sensitiveWords")){
//初次请求数据
$.ajax({
type:"POST",
cache: true,
url:tc+"getMgch",
data:{
dqy:1,shownum:1000000,like:''
},
success:function(msg){
if(msg!="" && msg!="[]" && msg!= null){
console.log("向 sensitveWords 中填充数据!");
var arr = msg.split("=");
sensitveWords=eval("("+arr[0]+")");
localStorage.setItem("sensitiveWords",arr[0]);
}
},
error:function(){
}
});
}else{
console.log("sensitveWords 中已有数据,不在重复加载!")
}
}
2.到了这就需要走方法来实现过滤了,网上也有相关的操作,但是作为一个程序员像这种自己能完成实现的还是比较喜欢自己去写更扎实(虽然写完时间长也忘)两部分是实现功能的全部代码,最初的时候把这个功能复杂的实现了,但是发现一点改一点,这就是最终的实现了,可以看到其实三个方法最终走的都是一个,其实就是在解析传递过来的数据格式,并根据需求返回相应数据格式
//判断 json
function contains(json){
if(json.substr(0,1) == "["){
json = json;
}else{
json = "["+json+"]";
}
var obj =eval("("+json+")");
for(var index in obj){
for(var o in obj[index]){
obj[index][o] = containsStr(obj[index][o]);
}
}
return JSON.stringify(obj);;
}
//判断 str
function containsStr(str){
for(var j =0; j<sensitveWords.length; j++){
if(str){
for(var i =0; i<sensitveWords.length; i++){
if(str.toString().indexOf(sensitveWords[j].mgcmc) !=-1){
var xing = dz(sensitveWords[j].mgcmc);
str = str.replace(sensitveWords[j].mgcmc,xing)
var id = sensitveWords[j].id;
var tjsj = sensitveWords[j].tjsj;
var glcs = getGlcs(id)+1;
var mgc = sensitveWords[j].mgcmc;
superMgcSave(id,tjsj,glcs,mgc);
}
}
}
}
return str;
}
//保存 过滤
function containsBC(json){
if(json.substr(0,1) == "["){
json = json;
}else{
json = "["+json+"]";
}
var obj =eval("("+json+")");
for(var index in obj){
for(var o in obj[index]){
obj[index][o] = containsStr(obj[index][o]);
}
}
return JSON.stringify(obj).substr(1,json.length-2);
}
function superMgcSave(id,tjsj,glcs,mgc){
json="{'id':'"+id+"','mgcmc':'"+mgc+"','tjsj':'"+tjsj+"','glcs':'"+glcs+"','sfsc':'0'}";
$.ajax({
type:"POST",
async:false,
url:tc+"bcMgch",
data:{
json:json,localcookies:document.cookie.match(new RegExp("(^| )userInfoCookies=([^;]*)(;|$)")) == null ? "":
unescape(document.cookie.match(new RegExp("(^| )userInfoCookies=([^;]*)(;|$)"))[2])
},success:function(msg){
if(msg=="ok"){
console.log("过滤次数修改成功!")
}else{
console.log("过滤次数修改失败,原因:"+msg)
}
},error:function(){
console.log("过滤次数修改:网络异常")
}
})
}
function getGlcs(id){
var glcs = "";
$.ajax({
url:tc+"getMgchById",
type:"POST",
async:false,
data:{
id:id
},success:function(msg){
if(msg !="" && msg !=null && msg !="[]"){
reList=eval("("+msg+")");
glcs = reList.glcs;
}
}
});
return glcs;
}
//递增 * 号
function dz(val){
var reStr="";
for (var j = 0; j < val.length; j++) {
reStr+='*'
}
return reStr;
}
function getWords(){
if(sensitveWords){
return sensitveWords;
}else{
init();
return sensitveWords;
}
}
以上就是过滤功能的实现,欢迎看过文章的朋友多多指教,一起学习,进步