JavaScript SPAM Word Filter - PullRequest
       22

JavaScript SPAM Word Filter

0 голосов
/ 27 апреля 2011

HI

Я пытаюсь использовать Javascript для написания простого фильтра слов СПАМ, который просматривает массив слов и пытается сопоставить все слово, которое передается в виде строки.

Ниже приведено то, что я имею до сих пор, и оно работает, за исключением того, что выполняет частичное сопоставление слов вместо сопоставления всего слова.

Итак, в моем примере ниже строка, переданная ниже:

Мы предлагаем отличные учебные классы и множество кредитов CE круглый год!

Соответствует слову " кредит "

Я ищу способ сопоставления всего слова, а не частичного совпадения слов.

Любая помощь будет оценена.

    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

1 Ответ

2 голосов
/ 27 апреля 2011

Вы можете сделать свой массив слов словами массивом регулярных выражений и маркером границы слова \b.Например:

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

... затем используйте функции exec или test для регулярного выражения для выполнения теста.

Фактически, ваш массив может стать одним массивным чередованием с \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 с небольшим количеством кода, для которого, как вы думаете, он вам нужен, и почему, и люди здесь предложат вам лучшую альтернативу.

...