परिसीमन में अल्फ़ान्यूमेरिक या बैकस्लैश और प्रीग_मैच नहीं होना चाहिए


86

मेरे पास यह कोड है:

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

और जब im चलाते हैं तो यह त्रुटि देता है:

चेतावनी: preg_match () [function.preg-match]: Delimiter में अल्फ़ान्यूमेरिक या स्वैश नहीं होना चाहिए


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

1
आपको अपने regexp स्ट्रिंग में एक सीमांकक की आवश्यकता है
Ki Jéy

2
उपयोग$pattern = "/My name is '(.*)' and im fine/";
जीके।

जवाबों:


133

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

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

रेगेक्स एक्सप्रेशन्स को एनकैश करने के लिए दोहरे उद्धरण चिह्नों का उपयोग करने से सावधान रहें, अन्यथा कुछ \ + वर्ण संयोजन (जैसे कि \lलाइन फीड) उनके चरित्र में परिवर्तित हो जाएंगे, जो उम्मीद के अलावा एक अभिव्यक्ति का उत्पादन कर सकते हैं। सिंगल कोट्स का इस्तेमाल करें। Php स्ट्रिंग्स विवरण देखें ।
पतंजलि

इस उदाहरण में स्ट्रिंग में एकल उद्धरण शामिल हैं, इसलिए इसे संलग्न करने के लिए दोहरे उद्धरण चिह्नों का उपयोग करना आसान है (बचने से बचने की \'आवश्यकता होगी यदि यह एकल उद्धरण में संलग्न था)।
पॉल

मैं एक सामान्य टिप्पणी कर रहा था, क्योंकि उदाहरण देखने वाले लोग उन्हें खुद के लिए 'कुकी-कट' के रूप में कुछ ले सकते हैं, अप्रत्याशित परिणामों को महसूस नहीं कर रहे हैं जो कि हो सकता है अगर वे इसे अन्य स्थितियों तक बढ़ाते हैं। दुर्भाग्य से, मैं अपनी टिप्पणी को और अधिक विशिष्ट नहीं बदल सकता।
पतंजलि

68

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

/something/

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

'/something/'

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

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

'/something/i'

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

'~something~'

1
@Gruber: धन्यवाद! आप हमेशा अपने सभी दोस्तों को इसके लिंक भेज सकते हैं और उन्हें इसे बढ़ा सकते हैं;)
iconoclast

1
यह समझाते हुए कि प्रलेखन क्या समझाता है .. +1 धन्यवाद!
Ju Oliveira

उच्चतम उत्तोलित उत्तर इस प्रकार है, हालांकि, अब मैं यह समझने के लिए आभारी हूं कि यह सही उत्तर क्यों है। +1 धन्यवाद!
इक्लेक्टिक

21

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

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

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

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

जैसा कि आप देख सकते हैं, iस्लैश के बाहर है और इसलिए एक संशोधक के रूप में व्याख्या की गई है।

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


7

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

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


0

हो सकता है कि मूल कोड उदाहरण से संबंधित नहीं है, लेकिन मुझे यह त्रुटि मिली "Delimiter को अल्फ़ान्यूमेरिक या बैकस्लैश नहीं होना चाहिए" और यहां Googled। कारण: मैंने preg_match के लिए मापदंडों का मिश्रित क्रम दिया है। पैटर्न दूसरा पैरामीटर था और स्ट्रिंग टू मैच पहले था। सावधान रहे :)


-2

कृपया इसके साथ प्रयास करें

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

कोष्ठक से बच क्यों?
Ki Jéy

1
@kiJey। ओपी की स्थिति में, वे नाम निकालना चाहते थे, इसलिए मैच के लिए कोष्ठक की आवश्यकता होती है, और इसलिए बच नहीं जाना चाहिए। यही कारण है कि मैं इसे नीचा दिखा रहा हूं।
पतंजलि
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.