एक कॉल उपयोग किया जा सकता अधिक पठनीय प्रारूप में
'%(?:Filed under:\s*+|\G</a>)[^<>]*+<a[^<>]*+>\K[^<>]*%`
या,:
'%(?:
Filed under: # your sentinel string
|
\G # NEXT MATCH POSITION
</a> # an end tag
)
[^<>]*+ # some non-tag stuff
<a[^<>]*+> # an opening tag
\K # RESET MATCH START
[^<>]+ # the tag's contents
%x'
012 बस मस्ती के लिए
यहाँ एक regex कि एक एकल preg_match_all
के साथ काम करेंगे हैउस स्थिति से मेल खाता है जहां अगला मैच प्रयास शुरू होगा, जो आमतौर पर वह जगह है जहां पिछले सफल मैच समाप्त हो गया था (लेकिन यदि पिछला मैच शून्य-लंबाई था, तो यह एक और आगे बढ़ता है)। इसका मतलब है कि रेगेक्स </a>
के बाद Filed under:
से कम से कम एक बार शुरू होने वाला मिलान करने वाला एक सबस्ट्रिंग से मेल नहीं खाएगा।
सेंटीनेल स्ट्रिंग या अंत टैग मिलान करने के बाद, [^<>]*+<a[^<>]*+>
अगले स्टार्ट टैग तक सबकुछ उपभोग करता है। फिर \K
प्रारंभ स्थिति को खराब कर देता है ताकि मैच (यदि कोई है तो) <a>
टैग के बाद शुरू होता प्रतीत होता है (यह सकारात्मक दिखने जैसा है, लेकिन अधिक लचीला है)। अंत में, [^<>]+
टैग की सामग्री से मेल खाता है और मैच स्थिति को अंत टैग तक लाता है ताकि \G
मिलान हो सके।
लेकिन, जैसा कि मैंने कहा, यह सिर्फ मजेदार है। यदि आप पर नहीं हैं, तो एक रेगेक्स में नौकरी करने के लिए, आप एक @ -odadaddict जैसे बहु-चरण दृष्टिकोण के साथ बेहतर हैं; यह अधिक पठनीय, अधिक लचीला, और अधिक रखरखाव योग्य है।
\K
reference
\G
reference
संपादित करें: हालांकि संदर्भ मैं दिया पर्ल डॉक्स के लिए कर रहे हैं, इन सुविधाओं पीएचपी द्वारा समर्थित हैं, भी - या, और अधिक सही, PCRE lib द्वारा। मुझे लगता है कि पर्ल डॉक्स थोड़ा बेहतर हैं, लेकिन आप PCRE manual में इस सामान के बारे में भी पढ़ सकते हैं।
स्रोत
2010-02-05 09:15:59
धन्यवाद, लेकिन मुझे वास्तव में "दायर:" ध्वज का उपयोग करने की आवश्यकता है। जबकि मेरा उदाहरण टेक्स्ट प्राथमिक था, वास्तविक फ़ाइल जिसे मैं पार्सिंग कर रहा हूं वह काफी जटिल है, और इसके तहत दायर: वास्तव में एकमात्र अद्वितीय पहचानकर्ता है जिसके साथ मुझे काम करना है। सौभाग्य से, यह फ़ाइल के अंत में है, इसलिए मैं अंत तक सभी तरह से मेल खा सकता हूं। –
पर्याप्त बंद करें। :) धन्यवाद। –