2011-03-18 19 views
16

मैं एक मुद्दे के एक सा में चल रहा हूँ जब यह subpatterns कि डॉलर चिह्न शामिल मिलान की बात आती है शामिल है। उदाहरण के लिए, पाठ के निम्नलिखित हिस्सा पर विचार करें:

Regular Price: $20.50  Final Price: $15.20 
Regular Price: $18.99  Final Price: $2.25 
Regular Price: $11.22  Final Price: $33.44 
Regular Price: $55.66  Final Price: $77.88 

मैं निम्नलिखित regex के साथ नियमित/अंतिम मूल्य सेट मिलान करने के प्रयास किया गया था, लेकिन यह सिर्फ काम नहीं कर रहा था (कोई मेल नहीं सभी):
preg_match_all("/Regular Price: \$(\d+\.\d{2}).*Final Price: \$(\d+\.\d{2})/U", $data, $matches);

मैं डॉलर साइन बच गए, तो क्या देता है?

+1

डॉलर चिह्न पर \\\ साथ भागने की कोशिश करो। समस्या डॉलर के संकेत और तथ्य यह है कि PHP कुछ काम करने के लिए $ का उपयोग करता है, के बीच संबंधों का अनुमान लगाना ठीक हो सकता है। (मैं काम करने के लिए भी $ का उपयोग करता हूं, यह केवल तार्किक लगता है)। –

+3

क्या आपने $ से बचने के बिना सिंगल कोट्स की कोशिश की है? – palindrom

उत्तर

32

एक डबल उद्धृत स्ट्रिंग के अंदर बैकस्लैश $ के लिए एक भागने चरित्र के रूप में व्यवहार किया जाता है। बैकस्लैश PHP पदव्याख्यायित्र पहले भी preg_match_all समारोह देखता द्वारा हटा दिया जाता:

$r = "/Regular Price: \$(\d+\.\d{2}).*Final Price: \$(\d+\.\d{2})/U"; 
var_dump($r); 

आउटपुट (ideone):

 
"/Regular Price: $(\d+\.\d{2}).*Final Price: $(\d+\.\d{2})/U" 
       ^      ^
       the backslashes are no longer there 

इस एक भी उद्धृत स्ट्रिंग एक डबल उद्धृत स्ट्रिंग के बजाय का उपयोग ठीक करने के लिए:

preg_match_all('/Regular Price: \$(\d+\.\d{2}).*Final Price: \$(\d+\.\d{2})/U', 
       $data, 
       $matches); 

ऑनलाइन काम कर यह देखें: ideone

+0

... या आप एक ही परिणाम के साथ '\ $' से पहले \ \ जोड़ सकते हैं। यह कम सुंदर है, लेकिन यह ठीक काम करता है। –

+0

मुझे एक ही समस्या थी, अभी बहुत बेवकूफ महसूस कर रहा है, धन्यवाद! – jreed121

+0

आपका समाधान भी मेरे लिए perl का उपयोग कर काम किया – Filype

6

मुझे पता है कि यह सवाल थोड़ा पुराना है, लेकिन मुझे एक ही समस्या का जवाब खोजने की कोशिश करते हुए यह मिला। मैंने देखा कि यह खोज इंजन रैंकिंग के शीर्ष पर था, इसलिए मुझे लगा कि यह एक साधारण विकल्प की व्याख्या करना अच्छा होगा, और यह दोहरा उद्धृत तारों के साथ क्यों होता है (")

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

मेरे समाधान "डबल बच" डॉलर साइन किया गया था। अपने उदाहरण में, यह करने के लिए

"/Regular Price: \\\$(\d+\.\d{2}).*Final Price: \\\$(\d+\.\d{2})/U"; 

ध्यान दें कि डॉलर साइन 3 स्लैश अब \\\ शामिल कुछ इसी तरह दिखना चाहिए।

असल में, हम व्याख्या के दो "स्तर", पीएचपी की है कि, और regex अभिव्यक्ति की है कि है। क्या हो रहा है कि एक स्लैश के साथ, PHP इसे परिवर्तनीय संशोधक के बजाय एक शाब्दिक चरित्र के रूप में व्याख्या करता है, इसलिए यह स्लैश खाता है, स्ट्रिंग को मार्क के उत्तर में उल्लिखित स्ट्रिंग का अर्थ देता है, और उसके बाद उसे रेगेक्स भेजता है, जो एक लुक-बैक के रूप में व्याख्या करता है।

डॉलर के हस्ताक्षर से "डबल से बचने" के द्वारा, PHP \\\$ को \\ और \$ क्रमशः व्याख्या करता है। हम पात्रों के पहले सेट से \ बचने, और दूसरा सेट से $ बचने, पीएचपी व्याख्या के बाद सिर्फ \$ हो जाती है। यह शाब्दिक स्ट्रिंग

"/Regular Price: \$(\d+\.\d{2}).*Final Price: \$(\d+\.\d{2})/U"; 
regex को

है, जो चरित्र शाब्दिक $, जो बजाय पीछे एक नज़र के रूप में अभिनय के $ से मेल खाएगा, क्योंकि यह बच रहा है के रूप में \$ व्याख्या करेगा भेज देंगे।यहां व्याख्या की दोहरी परतों को समझना महत्वपूर्ण है, क्योंकि PHP और regex दोनों में स्वयं की व्याख्या नियम हैं, और वर्णों से सही ढंग से बचने में 4 स्लैश लग सकते हैं।

एकल उद्धरण तार इस समस्या नहीं है, के बाद से एक स्ट्रिंग में एक चर $foo उपयोग करने के लिए, हम

'Hello '. $foo .'!'; 
बजाय

"Hello $foo!"; 

लिखने के लिए होता है हम डबल में कर सकते हैं जैसा तार। डबल उद्धृत तारों के विपरीत, सिंगल कोट स्ट्रिंग स्ट्रिंग के अंदर चर के रूप में चर के रूप में व्याख्या नहीं कर सकते हैं (जब तक कि वे ऊपर उदाहरण में शामिल नहीं होते हैं), बजाय उन्हें सादे पाठ के रूप में व्याख्या करते हैं। जब से हम अब और चर से बचने के लिए की जरूरत नहीं है, हम एक दोहरे उद्धरण स्ट्रिंग में regex के लिए, \\\$ साथ के रूप में ही बस

'/Regular Price: \$(\d+\.\d{2}).*Final Price: \$(\d+\.\d{2})/U' 

जो भेज देंगे \$ के साथ भाग प्राप्त कर सकते हैं।

यह व्यक्तिगत पसंद जो शैली पर आप का उपयोग करें, या जो पैटर्न के लिए आसान है के सभी बात है।

टी एल; डॉ: "/Hello \\\$bob/is" की तरह डबल उद्धृत स्ट्रिंग्स के लिए '/Hello \$bob/is', और \\\$ की तरह एकल उद्धृत स्ट्रिंग्स के लिए उपयोग \$

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