Подтвердить что ты не робот

Лучший способ алфавитно-цифровой проверки в Javascript

Можете ли вы предложить наилучший способ выполнить альфа-числовую проверку поля INPUT в JSP? Я прикрепил свой текущий код, и я знаю его нет, где близко к совершенству:)

<script type="text/javascript">
  function validateCode(){
      var TCode = document.getElementById('TCode').value;
      for(var i=0; i<TCode.length; i++)
      {
        var char1 = TCode.charAt(i);
        var cc = char1.charCodeAt(0);

        if((cc>47 && cc<58) || (cc>64 && cc<91) || (cc>96 && cc<123))
        {

        }
         else {
         alert('Input is not alphanumeric');
         return false;
         }
      }
     return true;     
   }

4b9b3361

Ответ 2

Исходная склонность автора к использованию str.charCodeAt(i) выглядит быстрее, чем альтернатива обычного выражения. В мой тест на jsPerf параметр RegExp работает на 66% медленнее в Chrome 36 (и немного медленнее в Firefox 31).

Здесь приведена очищенная версия исходного кода проверки, которая принимает строку и возвращает true или false:

function isAlphaNumeric(str) {
  var code, i, len;

  for (i = 0, len = str.length; i < len; i++) {
    code = str.charCodeAt(i);
    if (!(code > 47 && code < 58) && // numeric (0-9)
        !(code > 64 && code < 91) && // upper alpha (A-Z)
        !(code > 96 && code < 123)) { // lower alpha (a-z)
      return false;
    }
  }
  return true;
};

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

Ответ 3

Вам не нужно делать это по одному. Просто выполните тест для любого, который не является буквенно-цифровым. Если он найден, проверка не выполняется.

function validateCode(){
    var TCode = document.getElementById('TCode').value;
    if( /[^a-zA-Z0-9]/.test( TCode ) ) {
       alert('Input is not alphanumeric');
       return false;
    }
    return true;     
 }

Если есть хотя бы одно совпадение неабедианного числа, оно будет return false.

Ответ 4

Проверьте его с помощью регулярного выражения.

Javascript regexen не имеет классов символов POSIX, поэтому вам нужно писать диапазоны символов вручную:

if (!input_string.match(/^[0-9a-z]+$/))
  show_error_or_something()

Здесь ^ означает начало строки, а $ означает конец строки, а [0-9a-z]+ означает один или несколько символов от 0 до 9 ИЛИ от a до z.

Дополнительная информация о Javascript regexen здесь: https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions

Ответ 5

Я бы создал метод прототипа String:

String.prototype.isAlphaNumeric = function() {
  var regExp = /^[A-Za-z0-9]+$/;
  return (this.match(regExp));
};

Тогда использование будет:

var TCode = document.getElementById('TCode').value;
return TCode.isAlphaNumeric()

Ответ 6

    // On keypress event call the following method
    function AlphaNumCheck(e) {
        var charCode = (e.which) ? e.which : e.keyCode;
        if (charCode == 8) return true;

        var keynum;
        var keychar;
        var charcheck = /[a-zA-Z0-9]/;
        if (window.event) // IE
        {
            keynum = e.keyCode;
        }
        else {
            if (e.which) // Netscape/Firefox/Opera
            {
                keynum = e.which;
            }
            else return true;
        }

        keychar = String.fromCharCode(keynum);
        return charcheck.test(keychar);
    }

Кроме того, эта статья также помогает понять буквенно-цифровую проверку JavaScript.

Ответ 7

Простите меня, никаких споров. Но чтобы сообщество росло так, как оно выросло за эти годы, полезно сделать несколько замечаний.

Настоящая буквенно-цифровая строка похожа на "0a0a0a0b0c0d" а не на "000000" или "qwertyuio".

Все ответы, которые я прочитал здесь, вернулся true в обоих случаях. И простите меня, ИМХО, это не правильно.

Если я хочу проверить, является ли моя строка "00000" буквенно-цифровым, мой "человеческий" ответ, несомненно, ЛОЖЬ.

Зачем? Просто. Я не могу найти букву чар. Итак, простая числовая строка [0-9].

С другой стороны, если я хочу проверить мою строку "abcdefg", мой "человеческий" ответ даже ЛОЖЬ. Я не вижу цифры, так что это не буквенно-цифровой. Просто альфа [a-zA-Z].

Ответ Майкла Мартина-Смукера был осветительным.

Однако он был нацелен на достижение лучшей производительности вместо регулярных выражений. Это правда, если использовать низкоуровневый способ, чтобы улучшить производительность. Но результаты это то же самое. Строки "0123456789" (только числовые), "qwertyuiop" (только буквенные) и "0a1b2c3d4f4g" (буквенно-цифровые) возвращают TRUE как буквенно-цифровые. То же регулярное выражение /^[a-z0-9]+$/i путь. Причина, по которой регулярное выражение не работает, настолько проста, насколько очевидна. Синтаксис [] указывает или, а не и. Итак, если это только число или если это только буквы, регулярное выражение возвращает true.

Но ответ Майкла Мартина-Смукера, тем не менее, был осветительным. Для меня. Это позволило мне думать на "низком уровне", чтобы создать реальную функцию, которая однозначно обрабатывает буквенно-цифровую строку. Я назвал это как PHP относительную функцию ctype_alnum.

Вот код:

function ctype_alnum(str) {
  var code, i, len;
    var isNumeric = false, isAlpha = false; //I assume that it is all non-alphanumeric



  for (i = 0, len = str.length; i < len; i++) {
    code = str.charCodeAt(i);


        switch (true){
            case code > 47 && code < 58: // check if 0-9
                isNumeric = true;
                break;
            case (code > 64 && code < 91) || (code > 96 && code < 123): //check if A-Z or a-z
                isAlpha = true;
                break;
            default: // not 0-9, not A-Z or a-z
                return false; //stop function with false result, no more checks

        }

  }

  return isNumeric && isAlpha; //return the loop results, if both are true, the string is certainly alphanumeric
};

... а здесь ДЕМО

Я пришел к этому обсуждению, потому что я искал альтернативу в JavaScript для функции PHP. Я не нашел ответ "готов к работе", но, как это часто случается в Stackoverflow, концепция знания и сравнения друг с другом является чем-то возвышенным, что заставляет вас подумать о том, чтобы кто-то ответил, и вместе найти решение, которым вы были ищу, но ты не думал, что знал это.

И поделись этим!

Лучший

Оскар

Ответ 8

Чтобы проверить, является ли input_string буквенно-цифровым, просто используйте:

input_string.match(/[^\w]|_/) == null

Ответ 9

В тесном цикле, вероятно, лучше избегать регулярных выражений и жесткого кода ваших символов:

function isAlphanumeric(char) {
    return "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(char) > -1;
}