2012-01-19 11 views
5

/(<pre>|<code>|\[code])(.*)(</pre>|</code>|\[/code])/giरेगेक्स - यह क्यों नहीं है। * (डॉट-स्टार) मैच लाइन-ब्रेक?

यह काम करता है अगर मैं इस तरह के रूप कुछ है:

<code>foobar</code>

लेकिन अगर मैं इस तरह की एक लाइन ब्रेक के लिए गए थे:

<code> 
    Awesome 
</code> 

यह मेल नहीं खाएगी , मैं क्या गलत कर रहा हूं?

उत्तर

14

आपको DOTALL modifer /s की आवश्यकता है, क्योंकि . प्रति डिफ़ॉल्ट डॉट लाइनब्रेक को बाहर करता है। /g संशोधक ओटीओएच PHP और पीसीआरई में कानूनी नहीं है।

आपको .*? का भी उपयोग करना चाहिए ताकि बहुत व्यापक मिलान न हो।

3

क्योंकि . डिफ़ॉल्ट रूप से न्यूलाइन को छोड़कर प्रत्येक वर्ण से मेल खाता है, जब तक कि आप s स्विच में फ़ीड न करें।

रेगेक्स स्विच here के स्पष्टीकरण देखें।

विशेष

रों (PCRE_DOTALL) यह संशोधक सेट है, तो में, पैटर्न में एक डॉट metacharacter नई-पंक्तियों सहित सभी वर्ण, मेल खाता है। इसके बिना, न्यूलाइन को बाहर रखा गया है।

तो /(<pre>|<code>|\[code])(.*)(</pre>|</code>|\[/code])/is

(नहीं g, preg_match_all का उपयोग करें)।

6

पीसीआरई में, "।" हर चरित्र से मेल नहीं खाता है, यह हर बात यह है कि एक नई पंक्ति नहीं है मेल खाता है:

एक चरित्र वर्ग के बाहर, पैटर्न में एक डॉट विषय में किसी भी एक चरित्र, एक गैर मुद्रण चरित्र सहित से मेल खाता है, लेकिन नहीं (डिफ़ॉल्ट रूप से) नई लाइन।

(http://www.php.net/manual/en/regexp.reference.dot.php)

की तरह [\ s \ एस] के बजाय कोई प्रयास करें।

+3

या, आप जानते हैं, आप मेरे लिखने के दौरान पॉप किए गए तीन अन्य मान्य उत्तरों में से किसी एक को सुन सकते हैं। –

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