2011-01-27 14 views
5

मुझे स्ट्रिंग सत्यापन के लिए नियमित अभिव्यक्ति की आवश्यकता है। स्ट्रिंग खाली हो सकती है, इसमें 5 अंक हो सकते हैं, और 9 अंक हो सकते हैं। अन्य स्थितियां अमान्य है। मैं अगले रेगेक्स का उपयोग कर रहा हूं:PHP रेगेक्स अंकों की लंबाई केवल 5 या 9

/\d{5}|\d{9}/ 

लेकिन यह काम नहीं करता है।

+2

'/^(\ d {5}) (\ d {4})?) $ /'? यह मानते हुए कि स्ट्रिंग में अंक ही एकमात्र चीज हैं, यह 5 अंकों से मेल खाएगा, वैकल्पिक रूप से 4 और बाद में। –

+0

@MarcB: यह भी वाक्य रचनात्मक रूप से वैध नहीं है। –

+0

कुरकुरा, खाली स्ट्रिंग आपको क्या बताएगी? – sln

उत्तर

16

बस Marc B said in the comments के रूप में, मैं इस नियमित अभिव्यक्ति का प्रयोग करेंगे (अंक अभिव्यक्ति के चारों ओर ? क्वांटिफ़ायर को नोट करें जो समूह को वैकल्पिक बनाता है)।

वैकल्पिक रूप से अन्य उल्लिखित पैटर्न के विपरीत इस पैटर्न का लाभ यह है कि यदि पांच अंकों से मेल खाने में विफलता की आवश्यकता नहीं है तो उसे बैकट्रैकिंग की आवश्यकता नहीं होगी।

1

"काम नहीं करता" बहुत मदद नहीं है। लेकिन क्या ऐसा कुछ नहीं होगा?

/^(\d{5}|\d{9}|)$/ 

(regexp पर बिट जंग लगी, लेकिन मैं, "तो शुरू कर रहा है, 5 या 9 अंकों या कुछ भी नहीं करना है तो अंत कोशिश कर रहा हूँ)

3
~^(?:\d{5}|\d{9}|)$~ 

आप एंकर ^ और $ भूल गया उनके बिना स्ट्रिंग स्ट्रिंग में कहीं भी उन अंकों से मेल खाती है, न केवल शुरुआत या अंत में। इसके अलावा आपने खाली स्ट्रिंग केस को कवर नहीं किया है।

4

रिक्त स्ट्रिंग

को अनुमति देने के लिए एंकर और "?" का उपयोग करें

/^(\d{5}(\d{4})?)?$/ 

यह या तो वास्तव में पांच अंक है कि एक और चार अंक (कुल इस प्रकार नौ अंक) या कोई वर्ण बिल्कुल द्वारा पीछा किया जा सकता है मेल खाता है:

/^(\d{5}|\d{9})?$/ 
1

इसका जवाब यह क्यों है कि पर्ल स्टाइल रेगेक्स के विकल्पों को बाएं से दाएं प्राथमिकता दी जाती है। यह करने के लिए

बदलें:

/\d{9}|\d{5}/ (हालांकि, यह आप कुछ और नहीं बताएंगे के बारे में 6-8 और 10-अनंत जब तक अपने दावे या कोई अन्य विषय के साथ लंगर डाले।)

/^(\d{5}|\d{9}|)$/

संबंधित मुद्दे