2010-12-28 16 views

उत्तर

34

डिफ़ॉल्ट रूप से . नई लाइनों से मेल नहीं खाता - [\s\S] उस समस्या के आसपास एक हैक है।
यह जावास्क्रिप्ट में आम है, लेकिन PHP में आप सभी वर्णों को डॉट मिलान करने के लिए /s ध्वज का उपयोग कर सकते हैं।

+0

हमेशा 's' संशोधक होता है ... – BoltClock

+0

' .' नई लाइन से मेल खाता है? – yoyo

+0

@ बोल्टक्लॉक - धन्यवाद, मैं बस इसे प्राप्त कर रहा था, बस पुष्टि करना था कि यह PHP में कैसे किया गया है। – Kobi

15

. मेटा कैरेक्टर किसी न्यूलाइन को छोड़कर किसी भी चरित्र से मेल खाता है। तो पैटर्न .* जिसका उपयोग किसी भी चीज़ से मेल खाने के लिए किया जाता है, यदि आप न्यूलाइन से मेल खाते हैं तो भी काम नहीं करेगा।

preg_match('/^.*$/',"hello\nworld"); // returns 0 

[\s\S] जो खाली स्थान के पात्रों और गैर-सफ़ेद पात्रों में से एक चरित्र वर्ग है से मेल खाता है एक नई पंक्ति सहित किसी भी चरित्र इतना [\d\D], [\w\W] है। तो आपका पैटर्न [\s\S]* अब कुछ भी मेल खाता है।

preg_match('/^[\s\S]$/s',"hello\nworld"); // returns 1 

एक वैकल्पिक बनाने के लिए . मैच कुछ भी (एक नई पंक्ति सहित) एक s संशोधक का उपयोग करने के लिए है।

preg_match('/^(?s).*(?-s)$/',"hello\nworld"); // returns 1 

(?s)s मोड चालू करता है और (?-s) बदल जाता है, तो बंद:

preg_match('/^.*$/s',"hello\nworld"); // returns 1 

s संशोधक का उपयोग करके के वैकल्पिक रास्ते में-परत के रूप में यह है। एक बार . को बंद करने के बाद एक नई लाइन से मेल नहीं खाएगा।

+0

क्या अंतिम बिट केवल आसन्न '.' के व्यवहार को संशोधित करता है? मैंने पहले उस वाक्यविन्यास को नहीं देखा है। – BoltClock

+0

@ बोल्टक्लॉक - आप झंडे इनलाइन को सेट या साफ़ कर सकते हैं - यह सभी बिंदुओं के लिए काम करता है जब तक कि आप इसे साफ़ न करें: '(? Smi)। * Abc (? - smi)। * ABc' – Kobi

+0

@ कोबी: आह, यह वास्तव में अच्छा है! – BoltClock

1

[\s\S] एक चरित्र सेट जो लाइन ब्रेक सहित किसी भी चरित्र से मेल खाता है।

. लाइन ब्रेक को छोड़कर किसी भी चरित्र से मेल खाता है।

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