Лучший способ буквенно-цифровой проверки в Javascript - PullRequest
89 голосов
/ 14 декабря 2010

Не могли бы вы предложить наилучший из возможных способов выполнить буквенно-цифровую проверку поля 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;     
   }

Ответы [ 9 ]

85 голосов
/ 14 декабря 2010

Вы можете использовать это регулярное выражение /^[a-z0-9]+$/i

60 голосов
/ 17 августа 2014

Исходная склонность запрашивающего к использованию 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;
};

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

33 голосов
/ 28 декабря 2011

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

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

32 голосов
/ 14 декабря 2010

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

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.

7 голосов
/ 04 января 2014

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

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

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

var TCode = document.getElementById('TCode').value;
return TCode.isAlphaNumeric()
5 голосов
/ 29 декабря 2011
    // 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.

1 голос
/ 20 ноября 2018

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

Настоящая буквенно-цифровая строка похожа на "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
};

... и вот DEMO

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

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

Лучший

Оскар

0 голосов
/ 04 апреля 2019

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

function isAlphanumeric(char) {
    return "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(char) > -1;
}
0 голосов
/ 25 марта 2019

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

input_string.match(/[^\w]|_/) == null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...