php
  • regex
  • 2010-02-05 27 views 8 likes 
    8

    के मैच दोहरा मैं एक स्ट्रिंग है कुछ इस तरह लग सकता है है:पीएचपी नियमित अभिव्यक्ति - एक समूह

    preg_match_all("/Filed under: (?:<a.*?>([\w|\d|\s]+?)<\/a>)+?/", $r, $matches); 
    

    मैं चाहता हूँ:

    $r = 'Filed under: <a>Group1</a>, <a>Group2</a>'; 
    

    यहाँ नियमित अभिव्यक्ति मैं अब तक का उपयोग कर रहा है अंत में +? के साथ नामित मैच बनाने के लिए () के अंदर नियमित अभिव्यक्ति। लेकिन यह सिर्फ यह नहीं करेगा। :: श्वास ::

    कोई भी विचार। मुझे पता है कि इसे तोड़ने की बजाय एक नियमित अभिव्यक्ति में ऐसा करने का एक तरीका होना चाहिए।

    उत्तर

    5

    प्रयास करें:

    <?php 
    
    $r = 'Filed under: <a>Group1</a>, <a>Group2</a>, <a>Group3</a>, <a>Group4</a>'; 
    
    if(preg_match_all("/<a.*?>([^<]*?)<\/a>/", $r, $matches)) { 
        var_dump($matches[1]); 
    } 
    
    ?> 
    

    उत्पादन:

    array(4) { 
        [0]=> 
        string(6) "Group1" 
        [1]=> 
        string(6) "Group2" 
        [2]=> 
        string(6) "Group3" 
        [3]=> 
        string(6) "Group4" 
    } 
    

    संपादित करें:

    जब से तुम स्ट्रिंग खोज में 'के तहत दायर की' विशिष्ट मैच की पहचान के लिए शामिल करना चाहते हैं, तो आप इस कोशिश कर सकते हैं, मुझे यकीन है कि नहीं कर रहा हूँ अगर यह preg_match को

    // Since you want to match everything after 'Filed under' 
    if(preg_match("/Filed under:(.*)$/", $r, $matches)) { 
        if(preg_match_all("/<a.*?>([^<]*?)<\/a>/", $matches[1], $matches)) { 
         var_dump($matches[1]); 
        } 
    } 
    
    +0

    धन्यवाद, लेकिन मुझे वास्तव में "दायर:" ध्वज का उपयोग करने की आवश्यकता है। जबकि मेरा उदाहरण टेक्स्ट प्राथमिक था, वास्तविक फ़ाइल जिसे मैं पार्सिंग कर रहा हूं वह काफी जटिल है, और इसके तहत दायर: वास्तव में एकमात्र अद्वितीय पहचानकर्ता है जिसके साथ मुझे काम करना है। सौभाग्य से, यह फ़ाइल के अंत में है, इसलिए मैं अंत तक सभी तरह से मेल खा सकता हूं। –

    +0

    पर्याप्त बंद करें। :) धन्यवाद। –

    1

    मैं नियमित अभिव्यक्ति को() के अंदर + के साथ नामित मैचों को बनाने के लिए जारी रखना चाहता हूं? अतं मै।

    +? एक आलसी परिमाणक है - यह संभव के रूप में कुछ के रूप में बार से मेल खाएगी। दूसरे शब्दों में, बस एक बार।

    यदि आप कई बार मिलान करना चाहते हैं, तो आप एक लालची क्वांटिफायर - + चाहते हैं।

    यह भी ध्यान रखें कि आपका रेगेक्स काफी काम नहीं करता है - जैसे ही यह टैग के बीच कॉमा से मुकाबला करता है, मैच विफल रहता है, क्योंकि आपने इसके लिए जिम्मेदार नहीं ठहराया है। संभवतः इसे सुधारने की जरूरत है।

    +0

    ठीक है, मैंने केवल + क्वांटिफायर के साथ प्रयास किया है। यह भी विफल रहता है। और मैंने यह भी सोचा था, [कॉमा] जिसके लिए मुझे डर है, मुझे नहीं पता कि इसे कैसे सेट किया जाए, क्योंकि दूसरे या तीसरे मैच में कॉमा हो सकता है या नहीं। हालांकि मैंने इसे अपने प्रयास के रूप में आजमाया: [कोड] preg_match_all ("/ दायर: (?: ([\ w | \ d | \ s] +?) <\/a>। *?) + /", $ R , $ मैचों); [/ कोड] –

    +0

    हम्म, टिप्पणियां बहुत सुंदर नहीं दिखती हैं। –

    +0

    @ सेनेका: आप टिप्पणियों में कोड को प्रारूपित करने के लिए बैकटिक्स का उपयोग कर सकते हैं जैसे आप प्रश्नों और उत्तरों में कर सकते हैं, लेकिन यदि कोड लंबा या जटिल है, तो आपको अपना प्रश्न संपादित करना चाहिए और इसके बजाय इसे वहां रखना चाहिए। आपके द्वारा उपरोक्त कोड एक टिप्पणी के लिए थोड़ा अधिक था। –

    2
    $r = 'Filed under: <a>Group1</a>, <a>Group2</a>' 
    $s = explode("</a>",$r); 
    foreach ($s as $k){ 
        if ($k){ 
         $k=explode("<a>",$k); 
         print "$k[1]\n"; 
        } 
    } 
    

    उत्पादन

    $ php test.php 
    Group1 
    Group2 
    
    +1

    कभी-कभी RegExes वास्तव में कुछ करने का सबसे अच्छा तरीका है .... – SoapBox

    +1

    सर्वोत्तम या नहीं, व्यक्तिगत रूप से है। अगर इसे जटिल रेगेक्स के बिना किया जा सकता है, तो मेरे लिए और मेरे लिए बनाए रखने वाले दोनों के लिए यह सबसे अच्छा है। – ghostdog74

    +0

    जैसा कि मैंने ऊपर एक टिप्पणी में बताया है, मैं विस्फोट का उपयोग नहीं कर सकता .... एक के लिए, ऐसे मामले हैं जहां अल्पविराम नहीं है और केवल एक समूह है। दो, जबकि मेरा उदाहरण सरल था, यह एक जटिल फाइल है। टैग या तो इतना आसान नहीं है। तीन, मुझे दायर की आवश्यकता है: एक विस्फोट का उपयोग करने के रूप में विशेषता निश्चित रूप से अवांछित मूल्यों को वापस कर देगी। –

    8
    एक कॉल उपयोग किया जा सकता अधिक पठनीय प्रारूप में

    '%(?: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 में इस सामान के बारे में भी पढ़ सकते हैं।

    +0

    मुझे '\ K' के बारे में पता नहीं था। दिलचस्प! '\ G' के बारे में एक छोटा सा नोट - आप" पिछले मैच "का संदर्भ लें, जो ठीक है, और" अगला मैच ", जो थोड़ा उलझन में है (विशेष रूप से जब आप जिस पर्ल उदाहरण से जुड़े हुए हैं वह सीधे भ्रामक है - यह * सेट * कोड में अगली स्थिति सेट करता है - ** जो डिफ़ॉल्ट व्यवहार से बहुत अलग है **)। सीधे शब्दों में कहें - '\ G' उस स्थिति को संदर्भित करता है जिस पर वर्तमान मिलान शुरू करने का प्रयास किया गया था। यह सटीक' 'भी सही नहीं है' के तहत दायर: '- यह स्ट्रिंग की शुरुआत पर भी मेल खा सकता है, के लिए उदाहरण ', समूह 2': http://ideone.com/aTjrm। – Kobi

    +0

    (वैसे, मैं यहां से आया था: http://stackoverflow.com/questions/5982451/regex-capturing-a-repeated-group/7135730#7135730) – Kobi

    +0

    हम्म, वास्तव में, '\ G' की मेरी परिभाषा है अच्छा नहीं है। – Kobi

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