2010-12-13 3 views
70

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

<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;  
    } 

+1

Зависит от того, как вы определяете «лучший». Большинство ответов ниже предлагают regex, который выполняет [намного медленнее, чем ваш исходный код] (http://jsperf.com/alphanumeric-charcode-vs-regexp). Я [очистил ваш код] (http://stackoverflow.com/a/25352300/388639) немного, что на самом деле очень хорошо работает. –

ответ

65

Вы можете использовать this regex/^[a-z0-9]+$/i

+3

, конечно, это предполагает, что пустую строку ('' "') не следует сопоставлять. – zzzzBov

+0

Это круто :) Regex is sweet – t0mcat

+0

Это хорошо, но как насчет символов без ASCII? – Oybek

30

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

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.

26

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

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

+11

+1 для объяснения основного регулярного выражения и ссылки на руководство, вместо того, волшебная строка ". –

+4

вам необходимо добавить AZ – inor

5
// 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); 
    } 

Далее, this article также помогает понять, буквенно-цифровой проверки JavaScript.

5

Я хотел бы создать метод Строка прототипа:

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

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

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

[Доступный JavaScript: не изменять объекты, которые у вас нет) (http://www.nczonline.net/blog/2010/03/02/maintainable-javascript-dont-modify-objects -you-down-own /) – SeinopSys

+2

DJDavid98: Я не думаю, что здесь применяется правило «не изменять объекты, которые у вас нет». Джастин просто расширил возможности String, не изменяя существующие функции. Для перспективы, в мире C#, это будет считаться вполне допустимым использованием метода расширения. Даже если однажды «String.isAlphaNumeric(): boolean» будет реализован производителями браузеров, ни подпись, ни действие не изменились бы фактично, поэтому я не вижу никаких сокращений ремонтопригодности в этом конкретном примере. Что-то правило не означает, что исключений нет. –

40

оригинальный наклон Аскер на использование str.charCodeAt(i), кажется, быстрее, чем регулярное выражение альтернативы. В my test on 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; 
}; 

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

+8

Программисты любят внешний вид кода, но вы видите его внутреннюю красоту. – Ziggy

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