2016-05-23 4 views
0

Я пытаюсь сделать ярлык красным, если пользователь вводит запрещенное слово на клавиатуре. Я могу сделать это одним словом, но независимо от того, что я пробовал, я потерпел неудачу, когда дело дошло до нескольких.Как проверить массив запрещенных слов?

Это мой код:

username.onkeyup = function() { 

    var forbiddenWords = ["ffff, aaaa, bbbb, hhhh, ggggg"]; 
    var username_value = this.value.split(''); 

    function isForbiddenWord(value) { 
     for (var i = 0; i < forbiddenWords.length; i++) { 
      var rgx = new RegExp(forbiddenWords[i], 'gi'); 
      if (rgx.test(value)) { 
       return true; 
      } 
      else { 
       return false; 
      } 
     } 
    } 

    if (isForbiddenWord(this.value) == true) { 
     console.log('Username contains swearing word. Please, remove it'); 
     document.getElementById('username_label').style.color = "red"; 
    } 
    else { 
     if (username_value[username_value.length - 1] === "-" || username_value[username_value.length - 1] === "_") { 
      console.log('Username cannot end in dash (-) or underscore (_)'); 
      this.value = this.value.slice(0, -1); 
     } 
     else if (this.value.length < 4) { 
      console.log('Username cannot be less than 4 characters'); 
      document.getElementById('username_label').style.color = "red"; 
     } 
     else { 
      document.getElementById('username_label').style.color = "green"; 
     } 
    } 
} 
+1

простой способ без зацикливания:.. 'IsForbiddenWord =// test.bind (RegExp ("\\ Ь (" + [ "FFFF"," aaaa "," bbbb "," hhhh "," ggggg "]. join (") | (") +") \\ b ")' – dandavis

+0

У меня есть 30 запрещенных слов ... –

+0

RegExp может обрабатывать 30 слов. 300. Вероятно, 3000 ... я возьму собственную функцию над пользовательской землей в любой день, и без циклов и нескольких тестов(), один выстрел, вероятно, будет намного быстрее. Единственный недостаток, который я могу думать из-за того, что «запрещенные слова» меняются между исполнением, вам нужно будет перестроить RegExp. – dandavis

ответ

2

Ваш массив запрещенных слов в настоящее время состоит из 1 слова: "ffff, aaaa, bbbb, hhhh, ggggg". Ваш код работает, если вы используете это как массив:

var forbiddenWords = ["ffff", "aaaa", "bbbb", "hhhh", "ggggg"]; 
+0

Это буквально то, что перешло бы мне в голову! Миллион благодаря @ M4tini! –

+2

Вам также понадобится исправление @charlietfl, или оно обнаружит только '' ffff '' – M4tini

+0

Правильно, я понимаю, почему он выполнит только первый. Если я сделаю так, как отправил @charlietfl, все равно не будет ложным? Я имею в виду, если это слово запрещено, верните true и завершите цикл, затем верните false. Вот что я понимаю. –

3

Постарайся только возвращение ложным только после того, как цикл будет завершен, а не для каждого iterationas else. Таким образом, если они верны, истина вернет разрыв цикла, иначе, когда цикл будет выполнен, все будут определены как ложные.

Прямо сейчас, как только первый ложь встречается функция возвращает ложь и будет игнорировать все последующие слова в массиве

function isForbiddenWord(value) { 
    for (var i = 0; i < forbiddenWords.length; i++) { 
     var rgx = new RegExp(forbiddenWords[i], 'gi'); 
     if (rgx.test(value)) { 
      return true; 
     } 
     // move this outside loop 
     //else { 
      // return false; 
     //} 
    } 
    return false; 
} 

И, как было отмечено в других ответ исправить кавычки в массиве

+0

Какая разница? –

+1

Просто добавлено дополнительно строка текста для объяснения разница. Запустите его в своей голове ... или в отладчике в консоли браузера. Как только *** будет встречено какое-либо *** ложное, которое будет возвращено, а другие слова не будут проверены. – charlietfl

+0

Если я сделаю это, ваш путь не будет вообще ложным? Я имею в виду, если это слово запрещено, верните истину. Когда цикл завершится, верните значение false. Итак, это ложь ... Вот что я понимаю. –

Смежные вопросы