2011-10-05 17 views
45

मैं इस कोड होना चाहिए:सीमान्तक अक्षरांकीय या बैकस्लैश नहीं हो सकता है और preg_match

$string1 = "My name is 'Kate' and im fine"; 
$pattern = "My name is '(.*)' and im fine"; 
preg_match($pattern , $string1, $matches); 
echo $matches[1]; 

और यह इस त्रुटि देता है जब im चलाएँ:

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

+0

एक नोट है कि दूसरों के लिए सहायक हो सकता है, यदि आप 'preg_match करने के लिए() अपने सभी तर्कों से गुजर रहे हैं' चर के रूप में, सुनिश्चित करें कि आप चर गलती में मिश्रित के आदेश नहीं मिलता है बनाने के रूप में फ़ंक्शन कॉल के रूप में यह लगभग निश्चित रूप से इसी त्रुटि में दिखाई देगा। – bluebinary

उत्तर

86

आपको अपना पैटर्न के लिए एक सीमांकक की जरूरत है। यह बहुत तरह के शुरू और पैटर्न के अंत में जोड़ा जाना चाहिए:

$pattern = "/My name is '(.*)' and im fine/"; // With/as a delimeter 
+1

यह सही उत्तर होना चाहिए। –

1

इस

$pattern = "/My name is '\(.*\)' and im fine/"; 
+0

ब्रांड्स से बचें क्यों? –

18

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

$pattern = "/My name is '(.*)' and im fine/"; 

और एक ही उदाहरण नीचे लेकिन i संशोधक के साथ केस संवेदी किया जा रहा बिना मैच के लिए।

$pattern = "/My name is '(.*)' and im fine/i"; 

आप देख सकते हैं, i स्लैश के बाहर है और इसलिए एक संशोधक मान रहा है।

यह भी ध्यान रखें कि यदि आप एक डीलिमीटर के रूप में एक आगे स्लैश वर्ण (/) का उपयोग करते हैं तो आपको उपस्थित होने पर, नियमित अभिव्यक्ति के आगे/उपयोगों से बचने चाहिए।

29

समाधान (जो अन्य उत्तर — का उल्लेख नहीं करते हैं, कम से कम मेरे मूल रूप से इसे लिखने के समय) यह है कि जब PHP delimiters को संदर्भित करता है, तो यह आपके कोड में देखे गए डिलीमीटरों का जिक्र नहीं कर रहा है (जो उद्धरण चिह्न हैं) लेकिन स्ट्रिंग के अंदर अगले अक्षर। (वास्तव में मैं यह किसी भी दस्तावेज में कहीं भी कहा गया है कभी नहीं देखा है। आप उदाहरण में यह देखने के लिए किया है) तो बजाय क्या आप कई अन्य भाषाओं से करने के लिए अभ्यस्त हो सकता है की तरह एक नियमित अभिव्यक्ति वाक्य रचना होने के:

/something/ 

पीएचपी तार का उपयोग करता है, और फिर एक और सीमांकक के लिए स्ट्रिंग के अंदर दिखता है:

'/something/' 

सीमांकक पीएचपी ' पात्रों की जोड़ी के बजाय, के लिए बात कर रहा है / पात्रों में से जोड़ी है। तो यदि आप 'something' लिखते हैं, तो PHP s को इच्छित डेलीमीटर के रूप में ले जाएगा और शिकायत करेगा कि आपको अल्फान्यूमेरिक वर्णों को आपके डेलीमीटर के रूप में उपयोग करने की अनुमति नहीं है।

तो अगर आप (उदाहरण के लिए) पारित करने के लिए एक i पता चलता है कि आप एक मामले insensitve मैच चाहते हैं, तो आप इसे स्ट्रिंग के अंदर लेकिन regex सीमांकक के बाहर पारित:

'/something/i' 

यदि आप चाहते हैं अपने परिसीमक के रूप में / के अलावा कुछ का उपयोग करने के, आप कर सकते हैं, जैसे कि अगर आप किसी ऐसे URL मिलान कर रहे हैं और नहीं चाहते सभी स्लैश से बचने के लिए है करने के लिए:

'~something~' 
+1

इस पर्याप्त समय को ऊपर नहीं उठा सकता है! – Gruber

+0

@ ग्रबर: धन्यवाद! आप हमेशा अपने सभी दोस्तों के लिंक भेज सकते हैं और उन्हें ऊपर उठाने दें;) – iconoclast

+0

स्पष्टीकरण क्या दस्तावेज समझाता है .. +1 धन्यवाद! –

5

पैटर्न सीमांकक होना आवश्यक है। Delimiters एक आगे स्लैश (/) या किसी भी गैर अल्फान्यूमेरिक वर्ण (#, $, *, ...) हो सकता है। उदाहरण

$pattern = "/My name is '(.*)' and im fine/"; 
$pattern = "#My name is '(.*)' and im fine#"; 
$pattern = "@My name is '(.*)' and im [email protected]"; 
संबंधित मुद्दे