2010-05-21 12 views
22

मैं एक स्ट्रिंग को पार्स करने की कोशिश कर रहा हूं और उसी स्ट्रिंग से उसी स्ट्रिंग से डेटा के कई हिस्सों को प्राप्त कर रहा हूं। मैं एक HTML दस्तावेज़ जिसे स्थिर है पार्स करने कर रहा हूँ (एक अज्ञात कारण के लिए, मैं काम करने के लिए एक HTML पार्सर का उपयोग नहीं कर सकते।) मैं एक अभिव्यक्ति है कि तरह दिखता है:मैं एक ही पर्ल रेगेक्स से कई मैचों को कैप्चर कैसे कर सकता हूं?

$string =~ /\<img\ssrc\="(.*)"/; 

और मैं चाहता हूँ $ 1 का मूल्य प्राप्त करें। हालांकि, एक स्ट्रिंग में, इस तरह के कई आईएमजी टैग हैं, इसलिए मुझे कुछ सरणी की तरह कुछ चाहिए (@ 1?) क्या यह संभव है?

+0

इन मामलों में, मैं अपने इच्छित रेगिक्स में अधिक संदर्भ जोड़ता हूं ताकि मैं इच्छित छवि टैग प्राप्त कर सकूं। यही है, जब मुझे एचटीएमएल पार्सर का उपयोग करके सही नहीं लगता है, जैसे HTML :: SimpleLinkExtor जो आपके लिए सभी img src मान निकालता है। –

उत्तर

19

शेष मैचों कर रहे हैं जिम के जवाब के रूप में,/जी संशोधक (सूची संदर्भ में या एक पाश में) का उपयोग करें।

लेकिन लालची से सावधान रहें, आप .* को आवश्यक से अधिक मिलान करने के लिए नहीं चाहते हैं (और < से बचें नहीं, = वे विशेष नहीं हैं)।

while($string =~ /<img\s+src="(.*?)"/g) { 
    ... 
} 
+0

बहुत बढ़िया, हाँ मुझे लालची के साथ समस्या हो रही थी, वह? ठीक कर दिया। कहें, क्या आपको उन वर्णों की सूची जाननी होगी जिन्हें रेगेक्स में भागने की आवश्यकता है? मैं मूल रूप से लगभग हर चीज से बचता हूं क्योंकि मुझे बेहतर नहीं पता: पी –

+0

आम तौर पर आपको मेटाएक्टेक्टर और क्वांटिफायर से बचना चाहिए। पर्ल में आपके पास है: 'मेटाएक्टएक्टर्स:। $^|() [] \ Quantifiers: * +? {} ' लेकिन कुछ जटिलताओं हैं - विशेष रूप से, एक चरित्र वर्ग के अंदर [] चीजें बदलती हैं। – leonbloy

+1

... लेकिन उस लालच की समस्या को ठीक करने का बेहतर तरीका '"([^"] *) "' का उपयोग करना है। '' कई रेगेक्स इंजनों में, यह अधिक प्रभावशाली होगा, लेकिन, सबसे महत्वपूर्ण बात यह है कि यह एक स्पष्ट बयान है आपका इरादा: आप मिलान करना चाहते हैं "कुछ संख्याओं के बाद * गैर-डबलक्वॉट * वर्णों के बाद, किसी अन्य अक्षर के बाद," दो नहीं "वर्णों के सबसे कम संभव अनुक्रम से अलग किए गए *। –

2

, बाईं तरफ/जी संशोधक और सूची संदर्भ का उपयोग के रूप में

@result = $string =~ /\<img\ssrc\="(.*)"/g; 
+0

लेकिन मेरे पास तारों की एक सरणी नहीं है, केवल एक। मैं एकल स्ट्रिंग में एकाधिक आईएमजी टैग से अलग स्रोत प्राप्त करने की कोशिश कर रहा हूं, एक सरणी के रूप में लौटाया गया है। मैंने कोशिश की लेकिन यह कुछ भी वापस नहीं आया। –

+0

रॉबर्ट का उत्तर इस दृष्टिकोण के लिए सही वाक्यविन्यास देता है – leonbloy

+0

आपको क्या लगता है कि बाध्यकारी ऑपरेटर कर रहा है? :) –

5

में तुम बस मैच के अंत में वैश्विक संशोधक/जी की जरूरत है। तब के माध्यम से लूप जब तक वहाँ कोई

my @matches; 
while ($string =~ /\<img\ssrc\="(.*)"/g) { 
     push(@matches, $1); 
} 
7
@list = ($string =~ m/\<img\ssrc\="(.*)"/g); 

जी संशोधक स्ट्रिंग में सभी आवृत्तियां मेल खाता है। सूची संदर्भ सभी मैचों को लौटाता है। perlop में m // ऑपरेटर देखें।

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