JavaScript 垃圾邮件词过滤器

标签 javascript filter spam-prevention

你好

我正在尝试使用 Javascript 编写一个简单的垃圾邮件单词过滤器,该过滤器循环遍历单词数组并尝试匹配作为字符串传入的整个单词。

下面是我到目前为止所拥有的,它的工作原理只是进行部分单词匹配而不是匹配整个单词。

因此,在下面的示例中,传入的字符串如下:

我们全年提供优质的教育类(class)和许多 CE 学分!

匹配单词“credit

我正在寻找一种匹配整个单词而不是部分单词匹配的方法。

如有任何帮助,我们将不胜感激。

    var spam_words_arr=new Array(
"loan",
"winning",
"bulk email",
"mortgage",
"free",
"save",
"credit",
"amazing",
"bulk",
"email",
"opportunity",
"please read",
"reverses aging",
"hidden assets",
"stop snoring",
"free investment",
"dig up dirt on friends",
"stock disclaimer statement",
"multi level marketing",
"compare rates",
"cable converter",
"claims you can be removed from the list",
"removes wrinkles",
"compete for your business",
"free installation",
"free grant money",
"auto email removal",
"collect child support",
"free leads",
"amazing stuff",
"tells you it's an ad",
"cash bonus",
"promise you",
"claims to be in accordance with some spam law",
"search engine listings",
"free preview",
"act now! don't hesitate",
"credit bureaus",
"no investment",
"obligation",
"guarantee",
"refinance",
"price",
"affordable",
"home loan",
"lower your monthly payments",
"new low rate",
"Your Mortgage",
"Your refi",
"serious cash"); 



 function SubChecker() { 
    var sSubject = document.form1.subject.value;
    reset_alert_count();
    var alert_title = "The following words and phrases are not recommended in subject lines";
    var compare_text; 

        eval('compare_text=sSubject;'); 
            for(var j=0; j<spam_words_arr.length; j++) { 
                for(var k=0; k<(compare_text.length); k++) { 
                    if(spam_words_arr[j]==compare_text.substring(k,(k+spam_words_arr[j].length)).toLowerCase()) {
                        spam_alert_arr[spam_alert_count]=compare_text.substring(k,(k+spam_words_arr[j].length)); 
                        spam_alert_count++; 
                    } 
                } 
        } 
        for(var k=1; k<=spam_alert_count; k++) { 
            alert_text+= "<br> <li> "+ spam_alert_arr[k-1]; 
            eval('compare_text=document.form1.subject.focus();'); 
            eval('compare_text=document.form1.subject.select();'); 
        } 

    } 

好的,这是我的修订版,但我无法运行代码。有人可以看一下并给我一些建议吗?

提前致谢。

function SubChecker() { 
var sSubject = document.form1.subject.value;
reset_alert_count();
var alert_title = "The following words and phrases are not recommended in subject lines";


    for(var j=0; j<spam_words_arr.length; j++) {
            for(var k=0; k<(sSubject.length); k++) {
                var rExp = new RegExp("("+spam_words_arr[j]+")", "ig");
                alert(rExp);
                if(rExp.match(sSubject)){
                    spam_alert_count++;
                }
    }
    for(var k=1; k<=spam_alert_count; k++) {
        alert_text+= "<br> <li> "+ spam_alert_arr[k-1];

    }



enter code here

最佳答案

您可以将“单词”数组设为 regular expressions 数组,以及 \b 字边界标记。例如:

var spam_words_arr=new Array(
    /\bloan\b/i,
    ...
);

...然后使用 exectest正则表达式上的函数来进行测试。

事实上,您的数组可能会成为一个巨大的交替,两端都有 \b:

var regex = /\b(?:loan|winning|bulk email|mortgage|free)\b/i;

(我显然遗漏了数组的大部分内容。)在 JavaScript 正则表达式中,像 a|b 这样的替换意味着“匹配 a b.

为此使用正则表达式的另一个优点是,比暴力破解所有可疑单词列表更加灵活。

<小时/>

离题:

  1. 为了初始化数组,我建议使用数组文字表示法,而不是您使用的构造函数调用,例如:

    var spam_words_array = [
        entry,
        entry,
        entry,
        // ...
    ];
    

    它更短,它不会与重新定义Array的人发生冲突,并且您不会对var x = new Array(5);有什么歧义应该意味着(创建一个包含五个空白点的数组,而不是一个包含一个条目包含 5 的数组)。

  2. eval 的这些用法……很奇怪,因为它们看起来完全没有必要。需要 eval 的用例非常非常少(我已经成功地进行了几年的 JavaScript 编码,但从未在生产代码中使用过它)。如果您发现自己正在编写 eval,建议您在 StackOverflow 上发布一个问题,其中只包含您认为需要它的代码以及原因,这里的人员将为您提供更好的选择。

关于JavaScript 垃圾邮件词过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5806364/

相关文章:

MySQL 和 Socket.IO – 洪水数据库 > 重复事务

php - 如何在 phpBB3 中阻止垃圾邮件发送者?

php - 保护表单免受可编写脚本的垃圾邮件攻击

javascript - Redux.js 和数据有关系

PHP:INPUT_POST(在 filter_input_array 中使用)覆盖之前对 $_POST 的所有修改

arrays - Swift Array.filter 方法

java - 如何设置 AutocompleteTextView 一次只执行一个过滤器搜索并在开始过滤之前设置延迟?

javascript - Protractor 测试不适用于 IE,但适用于 FF/Chrome/Safari

javascript - 如何先检查cookie值然后转到页面?

javascript - 属性复制到继承类型的目的