2010-02-28 12 views
6

मैं एक उपयोगकर्ता की जांच के लिए एक सरल नियमित अभिव्यक्ति है:PHP में preg_match साथ मिलान UTF वर्ण: (* UTF8) विंडोज पर काम करता है, लेकिन नहीं लिनक्स

preg_match('/(*UTF8)^[[:alnum:]]([[:alnum:]]|[ _.-])+$/i', $username); 

स्थानीय परीक्षण में (विंडोज 7 WAMP का प्रयोग करके), इस यूटीएफ पात्रों (जैसे é या ñ) का उपयोग कर उपयोगकर्ता नामों की अनुमति देगा।

चेतावनी::() के [function.preg मैचों]: संकलन में विफल रहा है: (* VERB हालांकि, जब मैं सर्वर जहां साइट वास्तव में आयोजित किया जाएगा पर इस परीक्षण करने के लिए ले जाते हैं, मैं निम्नलिखित चेतावनी मिलती है) से मान्यता प्राप्त नहीं पर लाइन 12

पर /home/sites/vgmusic.com/test/Core/Impl/FormElementValidator.php में 5 ऑफसेट मैं भी एक स्थानीय उबंटू स्थापना पर इस की कोशिश की है और एक ही त्रुटि मिलती है। असल में, मैंने केवल इस काम को अपने स्थानीय विकास पर्यावरण पर देखा है। क्या ऐसे विशेष पात्रों की अनुमति देने का कोई तरीका है जो सभी ऑपरेटिंग सिस्टम के लिए काम करेंगे?

+0

आप क्या उम्मीद करते हैं कि '(* यूटीएफ 8)' करता है? – Gumbo

+0

ठीक है, इसे जोड़ने से पहले, ऊपर वर्णित होने पर एक उपरोक्त झूठी वापसी होगी। इसे जोड़ने के बाद, उन पात्रों को स्वीकार कर लिया गया था और उपरोक्त सत्य वापस आ गया। मैं उम्मीद कर रहा था कि यह वर्णित वर्णों की अनुमति दे। – Scott

+0

यह लगभग निश्चित रूप से PHP संस्करणों के लिए नीचे है। आप कौन से PHP संस्करण चला रहे हैं? क्या phpinfo() पृष्ठों में पीसीआरई संस्करणों पर कोई जानकारी है? –

उत्तर

14

अपने Unicode character properties के आधार पर पात्रों का वर्णन करके यह प्रयास करें:

preg_match('/^\p{L}[\p{L} _.-]+$/u', $username) 
+1

अच्छा लग रहा है। मेरा मानना ​​है कि निम्नलिखित संख्याओं की अनुमति भी होगी क्योंकि मूल उदाहरण में: 'preg_match ('/^ (\ p {L} | \ p {N}) [(\ p {L} | \ p {N}) _ ।-] + $/u ', $ उपयोगकर्ता नाम) ' – Scott

+0

@ एस। DePouw, ''/^ [\ p {एल} \ पी {एन}] [\ p {एल} \ पी {एन} _.-] + $/u'' बनाओ। एक चरित्र वर्ग के अंदर, '(', ')' और '|' बस '(', ')' और '|' से मेल खाता है। –

2

मैं पहले से ही /u पैरामीटर उल्लेख के साथ कोशिश कर रहा था। विंडोज़ (PHP 5.2.16) पर, /u पैरामीटर को जोड़ने से यूनिकोड वर्ण वाले स्ट्रिंग को कैप्चर करने के लिए ठीक काम किया गया, हालांकि सेंटोस 5 और PHP 5.2.16 पर मैं अभी भी .* का उपयोग करके यूनिकोड वर्ण वाले स्ट्रिंग को कैप्चर नहीं कर सकता (preg_match मूल रूप से विफल रहा कब्जा)।

कहीं भी नहीं मिल रहा है, 'LOCALE' सेटिंग्स के साथ गड़बड़ कर रहा है, जो कुछ भी नहीं बदला, मुझे अंत में this site मिला।

मैंने दिए गए उचित संस्करण आरपीएम के rpm -Uvh किए, अपाचे को पुनरारंभ किया, और अचानक मेरे regexes महान काम किया!

भले ही मेरे पास यूटीएफ -8 समर्थन प्रारंभ में था, फिर भी मेरे regexes unicode तारों को कैप्चर नहीं कर रहे थे जब तक कि मैंने अद्यतन आरपीएम स्थापित नहीं किया, जो "यूनिकोड गुण समर्थन" भी जोड़ता है। मैंने सोचा कि यूटीएफ -8 समर्थन पर्याप्त होगा, लेकिन स्पष्ट रूप से नहीं।

1

ऐसा लगता है कि यह एक पुरानी पोस्ट है, लेकिन यह हमेशा रुचि का विषय है, जिसे मैंने here खोजा है। यह एक छोटा सा अंतर है लेकिन कोड को और अधिक सरल बनाता है। बात यह है कि घुंघराले ब्रैकेट वैकल्पिक हैं। कि preg_match भी स्वीकार करता है

preg_match("/^\pL[\pL ]+$/u",$string) 

मैंने यह भी देखा:

Gumbo और स्कॉट ऊपर दिए गए कोड इस तरह अधिक सरल अगर किसी को केवल अक्षरों (यूनिकोड & गैर यूनिकोड) और खाली रिक्त स्थान की अनुमति देने के लिए करना चाहता है लिखा जा सकता है निम्न के रूप में अधिक सरल कोड:

preg_match("/^[\pL ]+$/u",$string) 
संबंधित मुद्दे