2013-07-29 12 views
7

ऐसा प्रतीत होता है कि कुछ मामलों में PHP के preg_match में दोहराने वाले वर्णों के मिलान के लिए 3276 वर्ण सीमा है।PHP preg_match लंबाई 3276 सीमा

अर्थात

^(.|\s){0,3276}$ काम करता है, लेकिन ^(.|\s){0,3277}$ नहीं करता है।

यह हमेशा लागू नहीं होता है, क्योंकि /^(.){0,3277}$/ काम करता है।

मुझे PHP के दस्तावेज़ या बग ट्रैकर में कहीं भी इसका उल्लेख नहीं किया जा सकता है। संख्या 3276 एक अजीब सीमा का थोड़ा सा लगता है, केवल एक चीज जिसे मैं सोच सकता हूं वह यह है कि यह 32767 का लगभग 1/10 वां है, जो एक हस्ताक्षरित 16-बिट पूर्णांक की सीमा है।

preg_last_error() रिटर्न 0.

मैं http://www.phpliveregex.com/ पर इस मुद्दे के साथ-साथ अपने स्थानीय सिस्टम और वेब सर्वर reproduced गए हैं।

संपादित करें: ऐसा लगता है कि हमें "चेतावनी: preg_match(): संकलन विफल हो रहा है: कोड से बाहर ऑफसेट 16 पर नियमित अभिव्यक्ति बहुत बड़ी है, इसलिए यह PHP preg_match_all limit जैसा ही समस्या है।

हालांकि, रेगेक्स स्वयं बहुत बड़ा नहीं है ... क्या PHP किसी प्रकार का विस्तार करता है जब आप दोहराते हुए समूह बनाते हैं जो इसे बहुत बड़ा बना रहा है?

+0

यह अधिक स्मृति की सीमा है, तो preg_match कई तत्वों के साथ एक सरणी लौटाएगा, इसलिए आपको बड़ी सरणी की अनुमति देने के लिए पर्याप्त स्मृति की आवश्यकता है, अपनी अधिकतम मेमोरी सीमा को ऊपर उठाने का प्रयास करें और देखें अगर यह बदल जाता है। –

+1

क्या आपने 'preg_last_error()' की जांच की थी? –

+0

आपकी त्रुटि रिपोर्टिंग पर है? यदि आप बहुत अधिक मेमोरी – x4rf41

उत्तर

1

का उपयोग कर आदेश पर्ल संगत नियमित अभिव्यक्ति को संभालने के लिए प्रयास, पीएचपी सिर्फ एक third-party library कि नौकरी का ख्याल रखता है बंडल। व्यवहार आपके द्वारा बताई गई वास्तव में documented है:

"*" परिमाणक {0,}, "+" {1,} को परिमाणक के बराबर है, और "?" {0,1} के लिए क्वांटिफायर। एन और एम तक सीमित हैं, परल निर्धारित होने पर परिभाषित प्रीसेट सीमा से कम गैर-ऋणात्मक अभिन्न मूल्य। यह आम तौर पर सबसे आम प्लेटफार्मों पर 32766 है।

तो हमेशा एक कठिन सीमा होती है। आपके परीक्षणों का सुझाव क्यों है कि PHP सीमा सामान्य से 10 गुना छोटी है? इसके बारे में कोई विचार नहीं :)

+0

+1 क्योंकि यह शायद समस्या है। प्रश्न में देखी गई छोटी सीमा केवल '.' और '\ s' को संयोजित करते समय लागू होती है जो बैकट्रैकिंग की बड़ी मात्रा में उत्पादन करने की गारंटी देता है। अगर हमें लगता है कि सीमा बैकट्रैकिंग से प्रभावित होती है (जो एक उचित अनुमान है) तो यह आश्चर्यचकित नहीं होगा कि सीमा इस तरह के स्तर पर आ गई है। – Spudley

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