2012-12-21 3 views
6

के लिए फॉर्म सत्यापन नियम मैं यह पहचानने की कोशिश कर रहा हूं कि मैं इस सत्यापन नियम के साथ क्या कर रहा हूं क्योंकि यह यह त्रुटि कह रहा है।regex_match

मान्यता नियम:

$this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean|regex_match[a-z0-9]'); 

त्रुटि:

Severity: Warning
Message: preg_match() [function.preg-match]: Delimiter must not be alphanumeric or backslash

+1

की संभावित डुप्लिकेट: http://stackoverflow.com/प्रश्न/7660545/सीमांकक-चाहिए-न-हो-अक्षरांकीय या बैकस्लैश और preg मैचों की – RonaldBarzell

+1

क्यों नहीं बस के बजाय 'alpha_numeric' नियम का उपयोग करें? देखें [पर्चा मान्यकरण नियम] (http://ellislab.com/codeigniter/user-guide/libraries/form_validation.html#rulereference) – PhearOfRayne

+0

@Steven फ़ार्ले क्योंकि उस बड़े अक्षरों है जो मैं नहीं चाहता के लिए अनुमति होगी। –

उत्तर

12

पहले, आप अपने पैटर्न को ठीक करने की जरूरत है। आपका पैटर्न अभी a-z0-9

यह एक सीमांकक यह enclosing, तो कुछ /a-z0-9/ तरह की जरूरत है (आप Codeigniter में मुद्दों बैकस्लैश सीमांकक का उपयोग कर है, तो आप अन्य विकल्पों की एक संख्या है: देखने The manual page on PCRE delimiters)

अब आपके पास एक पैटर्न है जो सचमुच a-z0-9 के साथ किसी स्ट्रिंग से मेल खाता है। ध्यान दें कि यदि आप इसे एक चरित्र वर्ग के रूप में मिलान करने का प्रयास कर रहे थे, तो आपको इसे बनाने के लिए इसे ब्रैकेट में फिर से एन्सेज़ करना होगा, इसलिए /[a-z0-9]/

अब मुझे लगता है कि आप वास्तव में पूरी जांच करना चाहते हैं स्ट्रिंग (लोअरकेस) अल्फान्यूमेरिक थी, न केवल यह कि उसके पास एक चरित्र मिलान था। इस मामले में आपको एक फ्रंट एंकर की आवश्यकता होती है, आपके चरित्र वर्ग से मिलान करने के लिए, पुनरावृत्ति संशोधक (मुझे लगता है कि आप एक खाली स्ट्रिंग से मेल नहीं करना चाहते हैं और इसे एक या अधिक बनाना चाहते हैं), और उसके बाद एक एंकर निर्दिष्ट करें कि मैच अंत करने के लिए विस्तार करना होगा:

/^[a-z0-9]+$/

तुम भी अधिक के लिए ब्रेसिज़ प्रतिस्थापन और एक न्यूनतम, अधिकतम (अधिकतम बाहर छोड़ यह मिनट से अधिक किसी भी लम्बाई होने के लिए अनुमति देने के लिए) प्रदान करके एक न्यूनतम लंबाई सेट कर सकते हैं। .. उदाहरण के लिए /^[a-z0-9]{3,}$

तो अपने तीसरे पैरामीटर अप की तरह लग रही खत्म होगा:

'trim|required|xss_clean|regex_match[/^[a-z0-9]+$/]'

सिवाय कि यह वास्तव में कारण जाहिरा तौर पर CodeIgniter में काम करेंगे नहीं (इस मामले वैसे भी था मार्च 2011 के रूप में), यह कैसे सत्यापन नियमों के अंदर कोष्ठक संभालती है, तो आप की आवश्यकता होगी कॉलबैक का उपयोग करें (see here)।

आप अपने नियंत्रक में निम्नलिखित की तरह एक समारोह रखेंगे (या अन्यथा उचित दायरे से): शासन

public function _usernameRegex($userName) { 
    if (preg_match('/^[a-z0-9]+$/', $userName)) 
    { 
    return TRUE; 
    } 
    else 
    { 
    return FALSE; 
    } 
} 

फिर आप सेट अपने समारोह कॉल करने के लिए:

एक callback का उपयोग करना
set_rules('username', 'Username', 'trim|required|xss_clean|callback__usernameRegex'); 

नोट्स: यदि आप नियंत्रक के भीतर अपना कॉलबैक फ़ंक्शन बनाते हैं तो फ़ंक्शन का उपयोग यूआरएल एक्सेस को रोकने के लिए एक अग्रणी अंडरस्कोर के साथ किया जाता है। CI_Form_validation कक्षा को विस्तारित करने वाली कक्षा बनाने के द्वारा ऐसा करने का एक वैकल्पिक तरीका है, लेकिन यह एक अधिक जटिल समाधान की तरह लग रहा था। यदि आप एक अग्रणी अंडरस्कोर के साथ फ़ंक्शन का नाम देते हैं, तो याद रखें कि होना चाहिए, फिर अपने नियमों में शामिल करें, जिसके परिणामस्वरूप callback__usernameRegex में दो अंडरस्कोर कुल होते हैं: callback_ के उपसर्ग के लिए और दूसरा, फ़ंक्शन के नाम के लिए दूसरा, _usernameRegex।यह पूरी तरह से सरल हो सकता है और आपको इंगित करने की आवश्यकता नहीं है, लेकिन मेरे लिए यह ऐसा कुछ प्रतीत होता है जिसे आसानी से याद किया जा सकता है। CI_Form_validation विस्तार पर एक विस्तृत विवरण के लिए Adding custom callback to Codeigniter Form Validation के लिए जुड़ा हुआ उत्तर देखें। ध्यान दें कि यदि आप फ़ॉर्म सत्यापन का विस्तार, आप callback_ के साथ अपने समारोह संलग्न करने के लिए जब आप set_rules में इसे संदर्भ की जरूरत नहीं है।

आप अपने नए कॉलबैक के लिए संदेश सेट कर सकते हैं:

$this->form_validation->set_message('usernameRegex', 'The %s field must only contain lowercase letters and/or numbers');


वैकल्पिक मार्ग Codeigniter के स्वयं के पैटर्न form_validation नियमों पर इस्तेमाल मैच संशोधित करने के लिए है। एलीस्लाब के फोरम का लिंक इस मुद्दे का वर्णन करता है और उसके बाद further down the thread के आसपास काम करने का एक संभावित तरीका है। कोडिग्निटर कोड पर ग्लासिंग और निर्दिष्ट फिक्स्ड से, प्रस्तावित समाधान नियमों में सरणी का उपयोग कर तोड़ सकता है: रिकर्सिव मिलान का उपयोग कर कोडिनेटर फ़ंक्शन में से किसी एक को बदलने के लिए एक बेहतर रेगेक्स दोनों को हल करेगा, लेकिन भारी पर प्रदर्शन समस्याओं में भाग ले सकता है नियम।

Codeigniter के form_validation नियमों के लिए पैटर्न मिलान 2.1.3 के रूप में, अपने सिस्टम/पुस्तकालयों/Form_validation.php फ़ाइल में पाया जाता है लाइन 115 पर।

+1

आपको [] को अंदर/अंदर रखना होगा क्योंकि कोडिनेटर नियमित अभिव्यक्ति को [] से घिरा होने की अपेक्षा करता है। –

+0

यह एक अच्छा पकड़ था और कोडिनेटर कैसे काम करता है इसके संदर्भ में मेरी गलती =) अब तय किया जाना चाहिए – taswyn

+0

वास्तविक नियमित अभिव्यक्ति पर अच्छी पकड़ एक वर्ण वर्ग –

0

php के preg_match अपने नियमित रूप से एक गैर अल्फा-न्यूमेरिक चरित्र से घिरा हुआ अभिव्यक्ति (आमतौर पर हर किसी का उपयोग करता है /), इस के लिए अपने setRules() को बदलने चाहता है:

$this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean|regex_match[/a-z0-9/]');