जावास्क्रिप्ट में अल्फ़ान्यूमेरिक जांच का सबसे अच्छा तरीका


107

किसी 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;     
   }


2
निर्भर करता है कि आप "सर्वश्रेष्ठ" कैसे परिभाषित करते हैं। नीचे दिए गए अधिकांश उत्तर रेगेक्स का सुझाव देते हैं, जो आपके मूल कोड की तुलना में बहुत धीमा प्रदर्शन करता है । मैंने आपका कोड थोड़ा साफ कर दिया है , जो वास्तव में बहुत अच्छा प्रदर्शन करता है।
माइकल मार्टिन-स्मूकर

जवाबों:


100

आप इस रेगेक्स का उपयोग कर सकते हैं /^[a-z0-9]+$/i


4
बेशक यह मानता है कि खाली स्ट्रिंग ( "") का मिलान नहीं होना चाहिए।
zzzzBov

15
ñहालांकि पूरी तरह से मान्य UTF-8 चार पैटर्न में नहीं आता है।
ओयबेक

8
/ ^ [a-z0-9] + $ / i.test (TCode)
एलेक्स वी

3
एक नियमित अभिव्यक्ति का परीक्षण, क्रोम 36 की तुलना में बहुत धीमा (66%) लगता है charCodeAt()। देखें jsPerf और नीचे मेरा उत्तर
माइकल मार्टिन-स्मूकर

5
यह रेगेक्स कुछ भाषाओं में उपयोग किए जाने वाले विशेष वर्ण अक्षरों के साथ काम नहीं करता है, जैसे "" "," ź "," ć "आदि
राफेल स्वचा

79

उपयोग करने के लिए पूछने वाले का मूल झुकाव str.charCodeAt(i)नियमित अभिव्यक्ति विकल्प की तुलना में तेज प्रतीत होता है। में jsPerf पर अपने परीक्षण क्रोम 36 (और थोड़ा फ़ायरफ़ॉक्स 31 में धीमी) में RegExp विकल्प प्रदर्शन 66% धीमी।

यहां मूल सत्यापन कोड का एक साफ-सुथरा संस्करण है जो एक स्ट्रिंग और रिटर्न प्राप्त करता है 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;
};

बेशक, अन्य विचार हो सकते हैं, जैसे पठनीयता। एक लाइन रेगुलर एक्सप्रेशन निश्चित रूप से देखने के लिए पहले से तय है। लेकिन यदि आप तेजी से चिंतित हैं, तो आप इस विकल्प पर विचार कर सकते हैं।


17
प्रोग्रामर को कोड का रूप पसंद है, लेकिन आप इसकी आंतरिक सुंदरता देखते हैं।
जिगी

दिलचस्प वैकल्पिक दृष्टिकोण - कभी भी मेरे दिमाग को पार नहीं किया। मैं यहाँ केवल regex को ध्यान में रखकर आया था!
ozzy432836

जवाब जो आपको लगता है और आपको समझ में आता है कि इसका क्या मतलब है "प्रोग्रामिंग"। मैं आपके सोचने के तरीके का उपयोग करता हूं, मेरे जवाब में
ऑस्कर जेरुस

42

इसे रेगेक्स से जांचें।

जावास्क्रिप्ट regexen में POSIX वर्ण कक्षाएं नहीं हैं, इसलिए आपको चरित्र श्रेणियों को मैन्युअल रूप से लिखना होगा:

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

यहाँ ^स्ट्रिंग की शुरुआत का मतलब है और $साधन स्ट्रिंग के समाप्त होते है और [0-9a-z]+इसका मतलब है एक या एक से से चरित्र के अधिक 0करने के लिए 9या से aकरने के लिए z

जावास्क्रिप्ट regexen पर अधिक जानकारी यहाँ: https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions


14
उपयोगकर्ता को "मैजिक स्ट्रिंग" देने के बजाय मूल रीगेक्स को समझाने और एक गाइड से जोड़ने के लिए +1।
चार्ल्स बर्न्स

4
@ आप केवल असंवेदनशीलता को निर्दिष्ट करने के लिए रीगेक्स के अंत में 'i' जोड़ सकते हैं .ie /^[a-z0-9]+$/iऔर यह लोअर और अपर केस दोनों अक्षरों को कवर करेगा
LJH

33

आपको इसे एक बार में करने की आवश्यकता नहीं है। बस उन सभी के लिए एक परीक्षण करें जो अल्फा-न्यूमेरिक नहीं हैं । यदि कोई पाया जाता है, तो सत्यापन विफल हो जाता है।

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


6

मैं एक स्ट्रिंग प्रोटोटाइप विधि बनाऊंगा:

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

फिर, उपयोग होगा:

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


2
DJDavid98: मुझे नहीं लगता कि नियम "उन वस्तुओं को संशोधित न करें जो आपके पास नहीं हैं" यहां लागू होता है। जस्टिन केवल स्ट्रिंग की क्षमताओं का विस्तार कर रहा था, मौजूदा कार्यात्मकताओं को संशोधित नहीं कर रहा था। परिप्रेक्ष्य के लिए, सी # दुनिया में, जिसे विस्तार विधि का पूरी तरह से वैध उपयोग माना जाएगा। यहां तक ​​कि अगर किसी दिन "String.isAlphaNumeric (): बूलियन" ब्राउज़र निर्माताओं द्वारा लागू किया जाएगा, तो न तो हस्ताक्षर और न ही कार्रवाई वास्तविक रूप से बदल जाएगी, इसलिए मैं इस विशेष उदाहरण में रखरखाव की कोई कमी नहीं देख सकता। यह एक नियम है जिसका अर्थ यह नहीं है कि कोई अपवाद नहीं हैं।
रिस्तो वेलामिक्की

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

इसके अलावा, यह लेख जावास्क्रिप्ट अल्फ़ान्यूमेरिक सत्यापन को समझने में भी मदद करता है।


3

मुझे माफ करना, कोई विवाद नहीं। लेकिन समुदाय के बढ़ने के लिए जैसा कि इन वर्षों में मुझे बड़ा हुआ है, कुछ नोट्स बनाना अच्छा है।

असली अल्फ़ान्यूमेरिक स्ट्रिंग की "0a0a0a0b0c0d"तरह है "000000"या नहीं की तरह है "qwertyuio"

मैंने यहां पढ़े सभी उत्तर, trueदोनों मामलों में वापस आ गए। और मुझे माफ कर दो, IMHO, यह सही नहीं है

यदि मैं जांचना चाहता हूं कि क्या मेरा "00000"स्ट्रिंग अल्फ़ान्यूम है, तो मेरा "मानव" उत्तर निर्विवाद रूप से FALSE है।

क्यों? सरल। मुझे कोई पत्र वर्ण नहीं मिल रहा है। तो, एक साधारण संख्यात्मक स्ट्रिंग है [0-9]

दूसरी ओर, अगर मैं अपने "abcdefg"स्ट्रिंग की जांच करना चाहता था, तो मेरा "मानव" उत्तर भी FALSE है। मुझे संख्याएँ दिखाई नहीं देतीं, इसलिए यह अल्फ़ान्यूमेरिक नहीं है। बस अल्फ़ाज़ हैं [a-zA-Z]

माइकल मार्टिन-Smucker है जवाब रोशन किया गया है।

हालाँकि उनका उद्देश्य रेक्स के बजाय बेहतर प्रदर्शन हासिल करना था। यह सच है, निम्न स्तर के तरीके का उपयोग करना बेहतर परफॉमेंस है। लेकिन परिणाम वही है। तार "0123456789"(केवल संख्यात्मक), "qwertyuiop"(केवल अल्फा) और "0a1b2c3d4f4g"(अल्फ़ान्यूमेरिक) TRUEअल्फ़ान्यूमेरिक के रूप में लौटते हैं । उसी रेगेक्स /^[a-z0-9]+$/iरास्ता। रीगेक्स काम नहीं करता है इसका कारण स्पष्ट रूप में सरल है। वाक्य-विन्यास []इंगित करता है या नहीं, और । तो, अगर यह केवल संख्यात्मक है या यदि यह केवल अक्षर है, तो रेगेक्स रिटर्न true

लेकिन, माइकल मार्टिन-स्मकर का जवाब अभी भी रोशन था। मेरे लिए। इसने मुझे "निम्न स्तर" पर सोचने की अनुमति दी, एक वास्तविक फ़ंक्शन बनाने के लिए जो अस्पष्ट रूप से एक अल्फ़ान्यूमेरिक स्ट्रिंग को संसाधित करता है। मैंने इसे PHP रिलेटिव फंक्शन की तरह कहा ctype_alnum( एडिट 2020-02-18: कहां, हालांकि, यह चेक करता है या नहीं और )।

यहाँ कोड है:

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

... और यहाँ डेमो है

मैं इस चर्चा में आया क्योंकि मैं PHP फ़ंक्शन के लिए जावास्क्रिप्ट में एक विकल्प की तलाश कर रहा था। मुझे इसका उत्तर "रेडी-टू-गो" नहीं मिला, लेकिन जैसा कि अक्सर स्टैकओवरफ़्लो पर होता है, ज्ञान और एक दूसरे के साथ तुलना की अवधारणा कुछ उदात्त है, जो आपको किसी के उत्तर के बारे में सोचने और एक साथ समाधान खोजने के लिए ले जाती है जो आप थे तलाश है, लेकिन आपको नहीं लगा कि आप इसे जानते हैं।

और शेयर करे!

श्रेष्ठ

ऑस्कर


उपर्युक्त अल्फ़ान्यूमेरिक नहीं, बल्कि अल्फ़ान्यूमेरिक को हल करता है। return isNumeric || isAlpha;अल्फ़ान्यूमेरिक है। उपरोक्त कुछ के लिए सहायक हो सकता है।
TamusJRoyce

1
@TamusJRoyce बेशक। लेकिन कुछ वैट नंबर की जांच करने के लिए छवि जहां कुछ मामले में सिर्फ संख्यात्मक है और अन्य मामले में अल्फा और संख्यात्मक होना चाहिए। वैसे, मैं केवल अब, मेरी गलती का एहसास करता हूं, कि रिश्तेदार PHP फ़ंक्शन foresees या के बजाय AND। यह एक समस्या है, क्योंकि मुझे अपने PHP अनुप्रयोगों के सभी कोडों को संशोधित करना था, जो एक ऐड-हॉक फ़ंक्शन के लिए प्रदान करता है जो AND
ऑस्कर Zarrus

3

एक तंग पाश में, शायद रेगेक्स से बचना और अपने पात्रों को हार्डकोड करना बेहतर है:

const CHARS = new Set("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
function isAlphanumeric(char) {
    return CHARS.has(char);
}

क्या आप इसे समझा सकते हैं
lazydeveloper

2
यह कोड O (N ^ 2) है जब एक पूरे स्ट्रिंग को लूप में स्कैन किया जाता है और इसके परिणामस्वरूप प्रस्तुत किए गए सबसे खराब रेगेक्स समाधानों की तुलना में कहीं अधिक खराब प्रदर्शन होगा (उदाहरण के लिए उपयोगकर्ता सभी 'Z's में गुजरता है, indexOf () को स्कैन करना होगा प्रत्येक पात्र के लिए अंत)। यह न केवल संभावित रूप से पूरे 0-Z स्ट्रिंग को स्कैन करने के ओवरहेड को उकसाता है (प्रदर्शन, औसतन, प्रति कॉल 18 वर्ण तुलना) बल्कि स्रोत स्ट्रिंग के प्रति चरित्र ओवरहेड के लायक दो फ़ंक्शन कॉल - बल्कि एक महत्वपूर्ण निरंतर समय मूल्य! कोड भी जहां यह प्रयोग किया जाता है पर निर्भर करता है एक DoS भेद्यता शुरू कर सकता है।
क्यूबिकलसॉफ्ट

1
आप बिल्कुल सही हैं क्यूबिकलसॉफ्ट। मैंने JS सेट का उपयोग करने के उत्तर को अपडेट किया।
मालगनीस

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.