HI
我正在尝试使用Javascript编写一个简单的垃圾邮件字过滤器,它循环遍历一个单词数组,并尝试匹配作为字符串传入的整个单词。
以下是我到目前为止所做的工作,除了它是部分字匹配而不是匹配整个单词。
所以在我的下面的例子中传递了下面的字符串:
我们整年都在提供优秀的教育课程和许多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
答案 0 :(得分:2)
您可以使“单词”数组成为regular expressions的数组,以及\b
单词边界标记。 E.g:
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
。
使用正则表达式的另一个好处是,您可以比所有可疑单词的强力列表更灵活。
关闭-主题强>:
为了初始化一个数组,我建议使用数组文字符号而不是你使用的构造函数调用,例如:
var spam_words_array = [
entry,
entry,
entry,
// ...
];
它更短,它不能与重新定义Array
的人发生冲突,并且你没有var x = new Array(5);
应该含义的模糊性(创建一个有五个空白点的数组,而不是一个包含5
的条目的数组。
eval
的用法是......奇怪的,因为它们似乎完全没必要。有很少的用例需要eval
(我已经设法进行了几年的JavaScript编码,而没有在生产代码中使用它)。如果您发现自己正在编写eval
,建议您在StackOverflow上发布一个问题,只需要您认为需要它的代码,以及为什么,这里的人们会为您提供更好的选择。