2013-08-03 12 views
10

से शुरू होने वाली लाइनों से मिलान करने के लिए PHP नियमित अभिव्यक्ति मेरे पास कुछ कॉन्फ़िगरेशन मान के साथ एक टेक्स्ट फ़ाइल है।एक विशेष वर्ण

1st line 
#test line this 
line #new line 
aaaa #aaaa 
bbbbbbbbbbb# 
cccccccccccc 
#ddddddddd 

मैं

लगाना चाहते हैं: वहाँ एक टिप्पणी एक # मैं रेगुलर एक्सप्रेशन पैटर्न है कि बाहर सभी लाइनों है कि एक #

तो, नमूना फ़ाइल के साथ शुरू मिलेगा खोजने की कोशिश कर रहा हूँ के साथ शुरू होता

preg_match_all("/^#(.*)$/siU",$text,$m); 
var_dump($m); 
:
#test line this 
#ddddddddd 

क्योंकि केवल इन दो पंक्तियों # के साथ शुरू मैं निम्नलिखित कोड की कोशिश की 210

लेकिन यह हमेशा खाली सरणी आउटपुट करता है। कोई भी मदद कर सकता है?

उत्तर

13

आप बहु संशोधक भूल गया (और आप नहीं singleline संशोधक का उपयोग करना चाहिए, यह भी केस-संवेदी संशोधक अनावश्यक है और साथ ही ungreedy संशोधक):

preg_match_all("/^#(.*)$/m",$text,$m); 

स्पष्टीकरण:

  • /m^ और $ को प्रारंभ/अंत में मिलान करने की अनुमति देता है लाइनों की, बस नहीं पूरी स्ट्रिंग (जो तुम यहाँ की जरूरत है)
  • /s डॉट नई-पंक्तियों (जो तुम यहाँ नहीं करना चाहती)
  • /i केस-संवेदी मिलान चालू हो जाती है (जो आप की जरूरत नहीं है मैच के लिए अनुमति देता है यहाँ)
  • /U ungreedy मिलान चालू करता है (जो anchors की वजह से यहां एक फर्क नहीं करता है)

एक PHP code demo:

$text = "1st line\n#test line this \nline #new line\naaaa #aaaa\nbbbbbbbbbbb#\ncccccccccccc\n#ddddddddd"; 
preg_match_all("/^#(.*)$/m",$text,$m); 
print_r($m[0]); 

परिणाम:

[0] => #test line this 
[1] => #ddddddddd 
+0

बहुत बहुत धन्यवाद .. मेरी समस्या हल हो गई :) –

2

आप बस लिख सकते हैं:

preg_match_all('~^#.*~m', $text, $m); 

के बाद से परिमाणक डिफ़ॉल्ट रूप से लालची है और डॉट डिफ़ॉल्ट रूप से नई-पंक्तियों से मेल नहीं खाता है, तो आप आप क्या चाहते प्राप्त करेंगे।

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