【问题标题】:Compare array of words to a textarea input with javascript使用 javascript 将单词数组与 textarea 输入进行比较
【发布时间】:2010-08-16 17:41:37
【问题描述】:

我在表单中有一个文本区域。

在提交表单之前,对文本区域进行验证和检查,使其不为空,不超过 2000 个字符,不包含禁止字符等...

我正在处理验证的最后一部分,这需要将 textarea 与“坏词”数组进行比较。

这有助于我在我的网站上维护和保持良好的“语言”。

我不是很擅长 js,那么有没有人知道将 textarea 的每个单词与坏单词数组进行比较的方法?

另外,这会大大减慢验证速度吗? (该数组最多包含 100 个单词)。

谢谢

【问题讨论】:

  • 客户端验证很容易被绕过,你应该在服务器端做一个检查(或者你打算两者都做?)
  • 其实我只计划客户端,因为我也会手动查看每个帖子...这只是为了让我的工作更轻松...

标签: php javascript html security validation


【解决方案1】:

如果您想检查“expletive1”和“expletive2”是否存在,您可以执行以下操作:

my_textarea = document.getElementById('textarea_id');

if (/\b(?=\w)(expletive1|expletive2)\b(?!\w)/i.test(my_textarea.value)) {
    // we found bad words!  do something
} else {
    // no bad words found, carry on, nothing to see here
}

您只需以相同的方式将更多单词添加到列表中 (expletive1|expletive2|expletive3|expletive4)

请记住,要完全将这些词排除在您的应用之外,您还需要进行服务器端过滤。

【讨论】:

  • 想简化代码以便我理解吗?这会将文本区域中的每个单词与数组匹配吗?
  • 做了一些编辑,希望能澄清一点。它将查看整个文本区域并匹配是否在文本区域中找到任何这些单词。请记住,这是一个非常简单的正则表达式,并且很容易绕过(即:就这个正则表达式而言,便便与便便不同)。
  • 好的,如果我在列表中同时添加“poop”和“poops”会发生什么?你的意思是它不会匹配“便便”?谢谢
  • 如果你同时添加“poop”和“poops”,那么它将匹配它们。我只是指出,您必须输入每个可能的变体、后缀和前缀的坏词。只需在您的列表中输入“poop”,就可以编写一个更复杂的正则表达式来匹配 poops、pooping、pooped 等(但您更有可能意外得到误报)。
  • 如果你有“便便”,它会匹配。他的意思是正则表达式(正则表达式)不会检测复数,但你可以这样设置。我有一种感觉,你不知道它们是什么。它们可以通过字符、长度甚至特定单词来限制输入。有很多控制……还有很多学习。看看这个网站:regular-expressions.info
【解决方案2】:
var bad_words = ['stupid', 'dang']; // watered down
for (var i = 0; i <= bad_words.length; i++) {
    if (document.getElementById('my_textarea').value.match(bad_words[i])) {
        // has bad word!
    }
}

这将使您的代码更整洁,因为您不必在一次正则表达式匹配中包含 100 个单词。

【讨论】:

  • 不会尝试将整个 textarea 句子与每个单词匹配吗?我需要拆分文本区域来逐字检查。
  • 这是一个相当幼稚的正则表达式,最终会禁止诸如“分类”之类的词。
  • 虽然它更干净,也更容易管理,所以它也值得称赞。在 if 语句中编辑单词列表是丑陋的。 Camran,也许您可​​以结合 Aaron 和 Jonah 的答案。
  • 实际上,如果您想编辑数组中的单词列表而不是正则表达式,那么我更喜欢 Topera 的从数组构建正则表达式的解决方案。它导致每个坏词只调用一个正则表达式而不是 1 个(我没有对许多简单的正则表达式与 1 个更复杂的正则表达式进行性能测试,但我的直觉告诉我 1 个正则表达式的性能会显着提高)。 Topera 只需要在他的正则表达式的前面和后面加上单词分隔符,这样他就只匹配整个单词。
【解决方案3】:

此代码用 ***** 替换坏词

// creating regex
var words = ['bad', 'words'];
var wordsStr = "";
for(var i=0; i<words.length; i++) {
    wordsStr += words[i];
    if (i < words.length -1) {
        wordsStr += "|";
    }
}
// wordsStr is "bad|words"
var regex = new RegExp(wordsStr, "gi"); // g: replace all; i:insensitive

// replacing
var text = "I cant say bad words!";
text = text.replace(regex, "****");
// text is "I cant say **** ****!"

jsfiddle

【讨论】:

    【解决方案4】:
    var bad_words = new Array('word1', 'word2');
    var user_words = document.getElementById('textarea').split(/\W+/);
    
    for( var i in bad_words)
    {
      if( user_words.indexOf( bad_words[i] ) != -1 )
      {
        alert( 'The textarea has bad word!');
        break;
      }
    }
    

    【讨论】:

    • +1 欢迎来到 SO,我相信我们在我的博客上进行了一些讨论 :)
    • @sarfaraz:是的,我记得 :)
    • @aaron: 我已经修改了拆分,现在拆分会破坏任何非单词字符上的字符串
    【解决方案5】:

    如果你愿意,你可以给我投反对票,但也许只是不要让clbuttic mistake 首先尝试过滤:D

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多