2009-08-03 12 views
10

हैं, मैं एक रेगेक्स की तलाश कर रहा हूं जो जांच करेगा कि स्ट्रिंग में केवल अक्षरों, संख्याओं, अंडरस्कोर (_) और हाइफ़न (-)। मैंने यह कोशिश की है, लेकिन यह काम नहीं करता है:एक रेगेक्स की आवश्यकता है जो जांच करेगा कि स्ट्रिंग में केवल अक्षरों और संख्याओं और अंडरस्कोर (_) और हाइफ़न (-)

if (!preg_match('/^a-zA-Z0-9_-$/', $string)) { 
    $reg_Error[] = 2; 
} 

इसके अलावा, क्या मैं रेगेक्स के साथ लंबाई की जांच कर सकता हूं? यदि नहीं, तो मैं इसे PHP के साथ करूँगा।

+2

स्ट्रेल के साथ लंबाई की जांच करें। रेगेक्स एक उपकरण है, हथौड़ा नहीं। :) – OIS

उत्तर

1

regex होना चाहिए: '^ [\ w \ घ -] + $'

+1

यह बताने के लिए कि: '-' स्क्वायर ब्रैकेट के अंदर एक विशेष चरित्र है * जब तक * यह ब्रैकेट में पहला या अंतिम अक्षर नहीं है। –

+0

'a-zA-Z_' को '\ w'' द्वारा प्रतिस्थापित किया जा सकता है,' 0-9' को '\ d' – RaYell

+1

' ए-जेए-जेड -9_' 'द्वारा प्रतिस्थापित किया जा सकता है केवल \ \ w' द्वारा प्रतिस्थापित किया जा सकता है। –

3

एक सबसे छोटा:

/^ [\ w -] + $/

+1

यहां तक ​​कि छोटा: '/^[\ w -] + $ /' – RaYell

+0

और अंडरस्कोर कहां है ?? – seize

+1

अंडरस्कोर '\ w' का हिस्सा है। –

14

आपको अपने रेगेक्स /^a-zA-Z0-9_-$/ को एक वर्ण वर्ग /[...]/ में रखना होगा।
इसका मतलब है कि आप चरित्र वर्ग में किसी भी चरित्र से मेल खा सकते हैं। आपको क्वांटिफायर भी निर्दिष्ट करना चाहिए, क्योंकि /^[a-zA-Z0-9_-]$/ केवल एक वर्ण से मेल खाता है।

उदाहरण: + संकेत के साथ
/^[a-zA-Z0-9_-]+$/ आप इसे एक या अधिक समय से मेल खाते हैं
/^[a-zA-Z0-9_-]{1,}$/ ही
/^[a-zA-Z0-9_-]{10,20}$/ लंबे 10 के बीच और 20 चरित्र से ऊपर के रूप में।
/^[a-zA-Z0-9_-]{15}$/ यह बिल्कुल 15 वर्ण लंबा होना चाहिए। आप स्ट्रिंग लंबाई की जांच के लिए इसका उपयोग कर सकते हैं।

आप भी अपने रेगुलर एक्सप्रेशन से पढ़ने के लिए आसान बनाने के लिए निम्न कीवर्ड का उपयोग कर सकते हैं:
/^[\w-]+$/ जो एक शब्द चरित्र या एक पानी का छींटा, एक या अधिक समय (अंडरस्कोर, अक्षर और अंक सहित) से मेल खाता है।

1

जवाब अब तक सही ढंग से चरित्र वर्ग/^[A-Za-z0-9_-]+$/

आप लंबाई की जांच कर सकते हैं समझाने। + का अर्थ है "पिछले एक या अधिक", * का अर्थ है शून्य से अधिक या अधिक "और {2,4} का मतलब है" पिछले 2 और 4 के बीच "।

आप लंबाई निर्दिष्ट नहीं कर सकते हालांकि, एक प्राइम बनें, यह निर्दिष्ट करना कि लंबाई भी संभव है लेकिन गैर-तुच्छ:/^(xx){1,3}$/xx, xxxx या xxxxxx से मेल खाता है। यहां की गणना जोड़ों की संख्या को संदर्भित करती है, x'es की संख्या नहीं

/^[a-z_\-\d]+$/i 

के रूप में मैं क्यों \w का उपयोग नहीं कर रहा हूँ, निम्नलिखित qu:

6

मैं इस एक का प्रयोग करेंगे OTE, PHP PCRE Pattern Reference से लिया, इसका कारण बताएं आप इस स्थिति में \w नहीं का उपयोग करना चाहिए करना चाहिए:,

ए 'शब्द "चरित्र किसी भी अक्षर या अंक या अंडरस्कोर वर्ण, वह यह है कि है किसी भी चरित्र है जो एक पर्ल "शब्द" का हिस्सा हो सकता है। पीसीआरई की वर्ण तालिकाओं द्वारा अक्षरों और अंकों की परिभाषा को नियंत्रित किया जाता है, और यदि लोकेल-विशिष्ट मिलान हो रहा है तो भिन्न हो सकता है। उदाहरण के लिए, "fr" (फ्रेंच) लोकेल में, 128 से अधिक वर्ण कोड कुछ उच्चारण अक्षरों के लिए उपयोग किए जाते हैं, और इन्हें \w से मिलान किया जाता है।

यही व्यवहार नहीं तो जब तक आप स्थान के बारे में चिंता करना चाहते हैं, \w आशुलिपि के बजाय सीधे चरित्र वर्गों का उपयोग, इस मामले में वांछित है।

आप (उदाहरण के 3 के लिए) एक न्यूनतम लंबाई निर्दिष्ट करने के लिए करना चाहते हैं:

/^[a-z_\-\d]{3,}$/i 

तुम दोनों एक न्यूनतम और अधिकतम लंबाई निर्दिष्ट करने के लिए चाहते हैं (उदाहरण के 2 के लिए और 5):

/^[a-z_\-\d]{2,5}$/i 
संबंधित मुद्दे