2009-03-29 16 views
13

में नई लाइनें सहित मैं एक स्ट्रिंग से मिलान करने की कोशिश कर रहा हूं जो एकाधिक लाइनों पर दिखाई दे सकता है। यह शुरू होता है और एक विशिष्ट स्ट्रिंग के साथ समाप्त होता है:PHP preg_replace फ़ंक्शन

{a}some string 
can be multiple lines 
{/a} 

मैं एक regex के साथ {a} और {/a} के बीच सब कुछ हड़पने कर सकते हैं? ऐसा लगता है। नई लाइनों से मेल नहीं खाता है, लेकिन मैंने बिना किसी किस्मत के निम्नलिखित प्रयास किए हैं:

$template = preg_replace($'/\{a\}([.\n]+)\{\/a\}/', 'X', $template, -1, $count); 
echo $count; // prints 0 

यह मेल खाता है। या \ n जब वे स्वयं पर हैं, लेकिन एक साथ नहीं!

उत्तर

31

उपयोग s modifier:

$template = preg_replace($'/\{a\}([.\n]+)\{\/a\}/s', 'X', $template, -1, $count); 
//            ^
echo $count; 
+0

बहुत बढ़िया, मुझे पता था कि यह कुछ आसान होगा! – DisgruntledGoat

+0

इसके अलावा, मैंने पाया कि यह जानकारी PHP वेबसाइट पर है, भले ही मुझे इसे देखने से पहले कभी नहीं मिला ... http://www.php.net/manual/en/reference.pcre.pattern.modifiers .php – DisgruntledGoat

3

http://www.regular-expressions.info/dot.html से:

"। डॉट देखभाल क्या है कि चरित्र है बिना एक भी चरित्र, से मेल खाता है एकमात्र अपवाद न्यू लाइन पात्र हैं।"

आपको अपनी अभिव्यक्ति में पिछला/झंडा जोड़ना होगा।

6

मुझे लगता है कि आपको केवल न्यूलाइन से मेल खाने वाले डॉट की तुलना में अधिक समस्याएं हैं, लेकिन मुझे फ़ॉर्मेटिंग अनुशंसा के साथ शुरू करने दें। आप किसी भी विराम चिह्न चरित्र के बारे में रेगेक्स डेलीमीटर के रूप में उपयोग कर सकते हैं, न केवल स्लैश ('/')। यदि आप किसी अन्य चरित्र का उपयोग करते हैं, तो आपको रेगेक्स के भीतर स्लेश से बचने की आवश्यकता नहीं होगी। मैं समझता हूं '%' PHPers के बीच लोकप्रिय है; कि अपने पैटर्न तर्क होगा:

'%\{a\}([.\n]+)\{/a\}%' 

अब, कारण यह है कि regex आपकी इच्छानुसार काम नहीं किया, जब यह एक चरित्र वर्ग (वर्ग कोष्ठक) के अंदर दिखाई देती है क्योंकि डॉट अपनी विशेष अर्थ खो देता है है - तो [.\n] बस एक डॉट या लाइनफीड से मेल खाता है। आप के लिए क्या देख रहे थे (?:.|\n) था, लेकिन मैं गाड़ी-वापसी के साथ ही linefeed मिलान की सिफारिश की है |:

'%\{a\}((?:.|[\r\n])+)\{/a\}%' 

ऐसा इसलिए है क्योंकि शब्द "न्यू लाइन" यूनिक्स शैली "\ n" का उल्लेख कर सकते है, विंडोज-शैली "\ r \ n", या पुरानी-मैक-शैली "\ r"। किसी भी दिए गए वेब पेज में उनमें से कोई भी या दो या दो से अधिक शैलियों का मिश्रण हो सकता है; "\ n" और "\ r \ n" का मिश्रण बहुत आम है। लेकिन/एस मोड (भी एकल लाइन या DOTALL मोड के रूप में जाना जाता है) के साथ, तो आप उस के बारे में चिंता करने की जरूरत नहीं:

'%\{a\}(.+)\{/a\}%s' 

हालांकि, वहाँ मूल regex अभी भी इस एक में मौजूद है कि के साथ एक और समस्या है: + लालची है। इसका मतलब है, यदि पाठ में एक से अधिक {a}...{/a} अनुक्रम है, तो पहली बार आपके रेगेक्स लागू होने पर यह उन सभी से मेल खाएगा, पहले {a} से अंतिम {/a} पर। अंत में

'%\{a\}(.+?)\{/a\}%s' 

, मैं क्या '$ के बनाने के लिए पता नहीं है: कि ठीक करने के लिए सबसे आसान तरीका + ungreedy (उर्फ, "आलसी" या "अनिच्छुक") एक प्रश्न चिह्न जोड़कर बनाना है 'आपके पैटर्न तर्क के उद्घाटन उद्धरण से पहले। मैं PHP नहीं करता, लेकिन यह मेरे लिए एक वाक्यविन्यास त्रुटि की तरह दिखता है। अगर कोई मुझे इस मामले में शिक्षित कर सकता है, तो मैं इसकी सराहना करता हूं।

+0

ओह, यह एक टाइपो होना चाहिए - मैं मूल रूप से वहां एक चर का उपयोग कर रहा था और इस उदाहरण के लिए इसे एक स्ट्रिंग के साथ बदल दिया था। – DisgruntledGoat

+0

यह एक महान स्पष्टीकरण था। इसके लिए चीयर्स। – craignewkirk

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