2012-09-25 6 views
10

मैंने PHP preg_match फ़ंक्शन के अंदर नियमित अभिव्यक्ति '!\d!' देखा है। यह क्या बकवास है?दोनों तरफ विस्मयादिबोधक चिह्नों के साथ नियमित अभिव्यक्ति ('! D!')

+7

रूप में ही है क्या downvotes साथ है? इसे बेहतर कहा जा सकता है, लेकिन मुझे लगता है कि यह एक उचित सवाल है। विराम चिह्न के लिए खोज मूल रूप से असंभव है और यह 'preg_match' दस्तावेज़ पृष्ठ से पीसीआर रेगेक्स डिलीमिटर्स दस्तावेज़ पृष्ठ पर तीन क्लिक है। और आपको पता होना चाहिए कि आप "रेगेक्स डिलीमीटर" की तलाश में हैं, लेकिन फिर आप पहले ही जवाब जानते हैं ... – verdesmarald

+0

मैं वर्षों से PHP कोडिंग कर रहा हूं और मैंने कभी नहीं देखा होगा! एक delimeter के रूप में इस्तेमाल किया! मैं गुगल हो गया और यह बहुत उपयोगी सवाल मिला। अनुलेख मुझे संदेह है कि इसे एक डिलीमीटर के रूप में उपयोग नहीं किया जाता है क्योंकि यह कम पठनीय कोड बनाता है। पहली नज़र में मैंने "नॉट" या "नकारात्मक मैच" का मतलब निकालने के लिए एक्सक्लेमिशन मार्क का अर्थ दिया, मुझे लगता है कि कई अन्य लोग भी ऐसा करते हैं ताकि वे पठनीयता के पक्ष में इससे बच सकें। –

उत्तर

12

PHP PCRE docs से:

PCRE कार्यों का उपयोग कर, यह आवश्यक है कि पैटर्न सीमांकक द्वारा संलग्न है। एक डिलीमीटर कोई गैर-अल्फान्यूमेरिक, गैर-बैकस्लैश, गैर-व्हाइटस्पेस वर्ण हो सकता है।

इस मामले में, यह केवल ! को डेलीमीटर के रूप में उपयोग कर रहा है। अक्सर इसका उपयोग तब किया जाता है जब आप रेगिक्स के भीतर सामान्य डिलीमीटर का उपयोग बिना बचने के स्वयं का उपयोग करना चाहते हैं। इस मामले में वास्तव में आवश्यक नहीं है क्योंकि शेष रेगेक्स बस \d है, लेकिन यह जांचने जैसी चीजों के लिए आसान है कि पथ में तीन से अधिक निर्देशिका स्तर हैं।

/\/.*\/.*\/.*\/ blah blah blah/

या:: आप दोनों में से किसी का उपयोग कर सकते

!/.*/.*/.*/ blah blah blah ! 

अब वे अच्छी तरह से परीक्षण नहीं किया गया है, और के रूप में विज्ञापित पूरी तरह से काम नहीं कर सकता, लेकिन आप कम से कम एस्केपिंग फिर से सामान्य विचार मिलना चाहिए की आवश्यकता है।

एक और उदाहरण (ऊपर से जुड़े पृष्ठ से) यह जांच रहा है कि कोई स्ट्रिंग http:// मार्कर से शुरू होती है या नहीं। इन दोनों में से कोई भी:

/^http:\/\// 
!^http://! 

पर्याप्त होगा, लेकिन दूसरा समझना आसान है।

+0

क्यों न केवल '\ d' लिखें? – Graduate

+0

अच्छा, यह काम नहीं करता है, मैंने जांच की है ... – Graduate

+0

@ स्नातक, आप जानना चाहते थे कि रेगेक्स का क्या अर्थ है। मैंने एक कारण भी प्रदान किया कि क्यों वैकल्पिक डिलीमीटर आसान हो सकते हैं, पूर्ण प्रकटीकरण के साथ इसे फिक्सिंग की आवश्यकता हो सकती है। इरादा यह दिखाने के लिए था कि वैकल्पिक delimiters का उपयोग करके _cleaner_ एक regex कितना हो सकता है, मैंने सुझाव नहीं दिया था कि आपको उन नमूनों का उपयोग करना चाहिए (कम से कम बिना डीबगिंग और 'ब्ला ब्ला ब्लाह बिट' को ठीक करना)। – paxdiablo

5

! को डिलीमीटर के रूप में उपयोग किया जाता है, \d एकल अंक से मेल खाता है।

यह /[0-9]/

+1

धन्यवाद, मैंने सोचा था कि आपको हमेशा चरित्र "/" का उपयोग करना होगा। मुझे नहीं पता था कि मैं इसे बदल सकता हूं। – Graduate

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