2014-04-28 4 views
7

की स्थिति के साथphp preg_match लौट आखिरी मैच

preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE); 

यह रिवर्स में एक स्ट्रिंग खोज करने के लिए संभव है? अर्थात। विषय strripos

के समान पैटर्न के अंतिम घटना की स्थिति लौटने या मैं preg_match_all साथ सभी मैचों की स्थिति लौट सकते हैं और $matches के अंतिम तत्व का उपयोग करना है?

+1

स्पष्ट रूप से बताएं, *** मैं इस है और मैं की जरूरत है इस उत्पादन ***, आप मदद करने के लिए मदद करते हैं। –

उत्तर

16

पीएचपी एक regex विधि (.net में) की तरह सही से एक स्ट्रिंग खोज छोड़ दिया करने के लिए नहीं है।

  • PREG_SET_ORDER ध्वज के साथ preg_match_all और end($matches) का उपयोग कर आप आखिरी मैच सेट
  • strrev के साथ स्ट्रिंग पीछे और निर्माण एक पैटर्न है कि आप preg_match
  • के साथ प्रयोग "उलट" दे देंगे: वहाँ है कि हल करने के लिए कई संभव तरीके हैं
  • preg_match का उपयोग कर और एक पैटर्न स्ट्रिंग है जो यह सुनिश्चित करता है वहाँ स्ट्रिंग के अंत तक खोजा गया नकाब के कोई और अधिक घटनाओं
  • से पहले एक लालची परिमाणक का उपयोग करें और \K का उपयोग वें शुरू करने के लिए के अंत में लंगर डाले निर्माण जिस स्थिति में आप चाहते हैं उस पर ई मैच परिणाम। एक बार स्ट्रिंग का अंत तक पहुंचने के बाद, रेगेक्स इंजन बैकट्रैक करेगा जब तक कि यह एक मैच न मिले।

    preg_match_all('/x[A-Z]+\d/', $str, $matches, PREG_SET_ORDER); 
    print_r(end($matches)); 
    

    रास्ता 2:

    if (preg_match('/\d[A-Z]+x/', strrev($str), $match)) 
        print_r(strrev($match[0])); 
    

    रास्ता 3:

    preg_match('/x[A-Z]+\d(?=(?:(?!x[A-Z]+\d).)*$)/', $str, $match); 
    
    स्ट्रिंग $str = 'xxABC1xxxABC2xx' साथ और पैटर्न /x[A-Z]+\d/

    तरह से 1 के लिए

उदाहरण

तरह से 3 (विविधता):

preg_match('/x[A-Z]+\d(?!.*x[A-Z]+\d)/', $str, $match); 

रास्ता 4:

preg_match('/^.*\Kx[A-Z]+\d/', $str, $match); 

तरह से 4 (विविधता): चरणों उलटे पांव लौटने को सीमित करने के लिए, आप एक परमाणु समूह में संभव हिस्सा संलग्न कर सकते हैं:

preg_match('/^(?>x[A-Z]+\d|[^x]+|x(?![A-Z]+\d))*\Kx[A-Z]+\d/', $str, $match); 
+0

मुट्ठी विधि के साथ गया, मुझे नहीं पता कि सभी मैचों को वापस करने में कुछ अनावश्यक व्यय है लेकिन यह ठीक काम करता है – andrew

+1

ग्रेट उत्तर महोदय। –

0

preg_match रिवर्स खोज का समर्थन नहीं करता है क्योंकि यह निरंतर नहीं है।

आप एक रेगेएक्सपी बना सकते हैं जिसमें लालची (वह डिफ़ॉल्ट है) लुकहेड है जो कुछ भी मेल खाता है (जैसे (?<=.*)stuff)। इस तरह आपको अपने मैच का आखिरी मौका मिलना चाहिए। आधिकारिक दस्तावेज यहां से

विस्तृत जानकारी: preg_match

+0

'(? <=। *) 'एक दिखने वाला और असीमित लंबाई दिखता है php द्वारा समर्थित नहीं है। – stema

+0

सही, मैंने दो नामों को मिश्रित किया, क्षमा करें। मुझे पता नहीं था कि PHP इसका समर्थन नहीं करता है। – Jonny007

1

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

पैटर्न नमूना कोड:

$pattern = "/<a[^\x3e]{0,}href=\x22([^\x22]*)\x22>([^\x3c]*)<\/a>/"; 

एचटीएमएल नमूना कोड:

$subject = '<ul> 
<li>Search Engines</li> 
<li><a href="https://www.google.com/">Google</a></li> 
<li><a href="http://www.bing.com/">Bing</a></li> 
<li><a href="https://duckduckgo.com/">DuckDuckGo</a></li> 
</ul>'; 

मेरे समारोह, यह पिछले तत्व की भरपाई कब्जा है और आप संभावना मिलान की संख्या का संकेत करने के लिए है:

function get_offset_last_match($pattern, $subject, $number) { 
    if (preg_match_all($pattern, $subject, $matches, PREG_OFFSET_CAPTURE) == false) { 
     return false; 
    } 
    return $matches[$number][count($matches[0]) - 1][1]; 
} 

आप preg_match_allके बारे में विस्तृत जानकारी प्राप्त कर सकते हैं आधिकारिक दस्तावेज पर 10।

उदाहरण के लिए मेरी पैटर्न का उपयोग करना:

0 => सभी पाठ
1 => href मूल्य
2 => innerHTML

echo '<pre>'; 
echo get_offset_last_match($pattern, $subject, 0) . PHP_EOL; // all text 
echo get_offset_last_match($pattern, $subject, 1) . PHP_EOL; // href value 
echo get_offset_last_match($pattern, $subject, 2) . PHP_EOL; // innerHTML 
echo '</pre>'; 
die(); 

आउटपुट है:

140 
149 
174 

मेरे फ़ंक्शन (टेक्स्ट):

function get_text_last_match($pattern, $subject, $number) { 
    if (preg_match_all($pattern, $subject, $matches, PREG_OFFSET_CAPTURE) == false) { 
     return false; 
    } 
    return $matches[$number][count($matches[0]) - 1][0]; 
} 

नमूना कोड:

echo '<textarea style="font-family: Consolas: font-size: 14px; height: 200px; tab-size: 4; width: 90%;">'; 
echo 'ALL = ' . get_text_last_match($pattern, $subject, 0) . PHP_EOL; // all text 
echo 'HREF = ' . get_text_last_match($pattern, $subject, 1) . PHP_EOL; // href value 
echo 'INNER = ' . get_text_last_match($pattern, $subject, 2) . PHP_EOL; // innerHTML 
echo '</textarea>'; 

आउटपुट है:

ALL = <a href="https://duckduckgo.com/">DuckDuckGo</a> 
HREF = https://duckduckgo.com/ 
INNER = DuckDuckGo 
+0

अंतर्दृष्टि +1 के लिए धन्यवाद – andrew

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