2012-05-17 16 views
6

मैं नियमित अभिव्यक्ति के साथ अच्छा नहीं कर रहा हूँ, तो मैं भी नहीं जानता कि क्या यह एक करता है में विफल रहता है, वास्तव में:preg_match php> 5.3

echo preg_match('/^(([a-zA-Z0-9\x2d]{1,63}\x2e)*[a-zA-Z0-9\x2d]{1,63}){1,254}$/', 'example12345678.com>'); 

मैं इसे Zend फ्रेमवर्क के एक पुराने संस्करण से ले गया - 1.5, जो पुराना है और ढांचे के अंतिम स्थिर संस्करण में यह regexp अब प्रस्तुत नहीं किया गया है। हालांकि, इसका व्यवहार उत्सुक है, क्योंकि मुझे आधिकारिक PHP संसाधनों में कोई दस्तावेजी स्पष्टीकरण या पिछड़ा असंगतता नोट नहीं मिला है।

बात यह है कि php 5.2 पर है * यह ठीक काम करता है:। रिटर्न 0. php 5.3.10, 5.4.0 पर यह FALSE देता है, जिसका अर्थ है 'एक त्रुटि (सबसे अधिक संभावना 5.3 , 5.4 मुझे लगता है।।) "।

मेरा प्रश्न है: क्यों? और त्रुटि क्या है? क्या यह regexp है, किसी तरह का रिकर्सन या नियम अस्पष्टता? यदि ऐसा है तो यह PHP 5.2 पर क्यों काम करता है?


दिलचस्प बात यह है कि अगर मैं बदल 'example12345678.com>' के लिए 'example1234567.com>' (जिससे यह एक या अधिक चार कम) - कि काम शुरू करने और 0. देता है, तो मैं इसे 123123123123123123123123123 करने के लिए 'को बदलने 'यह भी काम करता है और रिटर्न 1.

युपीडी: अभी तक पता नहीं है, तो इस मामले को लेकिन PCRE संस्करणों यहां 8.02 (php 5.2) बनाम 8.12 कर रहे हैं (php 5,3)


UPD2: मैं समझता हूं कि यह क्या है ... अधिक या कम ... और अभी कुछ भी काम करने में कोई समस्या नहीं है। जैसा कि मैंने कहा - एक Zend_Validate_ * अद्यतन हल करता है। मैं अन्य शब्दों में अपनी चिंता का वर्णन करने की कोशिश करूंगा:

कहता है, मैं php5.2> php5.3 स्विच बनाने, सॉफ़्टवेयर का एक महत्वपूर्ण टुकड़ा अपग्रेड करता हूं। मैं उन सभी समस्याओं पर जानकारी ढूंढने का प्रयास करता हूं जिनसे मुझे सामना करना पड़ सकता है (ज्यादातर इसे पढ़कर: http://php.net/manual/en/migration53.php)। सॉफ्टवेयर थोड़ा पुराना है, लेकिन यह प्राचीन नहीं है, उदा। ज़ेंड फ्रेमवर्क संस्करण 1.5 का हो सकता है। मैं प्रत्येक बीसी ब्रेक और बहिष्कृत फीचर को चेक/पैच/विश्लेषण और ठीक करता हूं। यहां तक ​​कि मेरे यूनिट परीक्षण भी ठीक चलते हैं।

मेरे आश्चर्य के लिए सवाल में क्या वर्णन किया गया है। (सटीक होने के लिए, Zend_Validate_Hostname वहां अपवाद फेंकता है)। तो अब मैं जानना चाहता हूं कि अपग्रेड करते समय मुझे यह क्यों याद आया और, और क्या महत्वपूर्ण है, क्या मुझे ऐप में सभी 'preg_match' (और अन्य पीसीआर उपयोग करने वाले फ़ंक्शंस) को दोबारा जांचना चाहिए, जैसे कि "बग फिक्स" "।

यदि यह एक "बग फिक्स" है। क्योंकि यह एक नई बग की तरह दिखता है - यह php5.2 में अपेक्षित काम करता था और अब और काम नहीं करता है।

खोज को सीमित करने के लिए कुछ सुराग प्राप्त करने की उम्मीद कर रहा था।

+1

तुम इसे कैसे उपयोग कर रहे हैं यदि आप नहीं जानते कि वह क्या करता , ठीक ठीक? – ilanco

+0

और आपने इसे किस फाइल से लिया? –

+0

@ilanco, मैं इसे ढांचे के एक हिस्से के रूप में उपयोग कर रहा हूं। हालांकि यह ऑफटॉप है। – lcf

उत्तर

2

यह एक बदसूरत नियमित अभिव्यक्ति है। समस्या यह है कि स्ट्रिंग मैच हो सकता है कि बहुत से तरीके हैं, और इसलिए इंजन यह याद करने से पहले स्मृति से बाहर चल रहा है कि यह वास्तव में मेल नहीं खाता है।

इसके अलावा, ऐसा लगता है कि यह वैध डोमेन नामों से मेल खाने का प्रयास कर रहा है, और ऐसा नहीं है।

function is_valid_domain_name($string) { 
    if (strlen($string) > 253) { 
     return false; 
    } 
    $label = '(?!-)[a-zA-Z0-9-]{0,63}(?<!-)'; 
    return preg_match("/^(?:$label\.){0,126}$label$/", $string); 
} 

यह आपकी समस्या स्ट्रिंग पर जल्दी से विफल रहता है:: मैं बजाय इस समारोह के लिए एक कॉल के साथ preg_match है कि कॉल की जगह लेंगे

echo is_valid_domain_name('example12345678.com>'),"\n"; 
+0

यह वास्तव में बदसूरत है। अधिकांश अन्य नियमित अभिव्यक्तियों की तरह। :) आपके उत्तर मार्क के लिए धन्यवाद। हालांकि, इस विशेष regexp के साथ समस्या हल हो गई थी। मैंने जो पूछा था वह था: यह php5.2 के साथ क्यों काम करता था? मैंने कुछ प्रश्नों के साथ अपना प्रश्न अपडेट किया। – lcf

+0

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

+0

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