2012-03-05 20 views
27

मुझे पता है कि किसी दिए गए स्ट्रिंग में रेगेक्स पैटर्न के वास्तविक मैचों को खोजने के लिए preg_match और preg_match_all का उपयोग कैसे करें, लेकिन जो फ़ंक्शन मैं लिख रहा हूं न केवल मैचों के पाठ की आवश्यकता है, बल्कि मैचों के पार स्ट्रिंग को पार करने में सक्षम होने के लिए ...स्ट्रिंग में रेगेक्स मैच की स्थिति कैसे प्राप्त करें?

इसलिए, मुझे रेगेक्स पैटर्न के आधार पर स्ट्रिंग में मिलान की स्थिति जानने की आवश्यकता है।

मुझे स्ट्रॉप्स() के समान फ़ंक्शन नहीं मिल रहा है जो regex को अनुमति देता है ... कोई विचार?

+0

एक बार आपके पास मैच होने के बाद, क्या आप इसकी स्थिति खोजने के लिए केवल 'strpos() 'का उपयोग नहीं कर सकते? – scibuff

+0

डुप्लिकेट ?: http://stackoverflow.com/questions/3547564/running-a-regular-expression-need-to-find-exact-location-of-a-string-patterns – michaelmichael

+0

एक बार जब आप अपने मैच प्राप्त कर लेते हैं, तो आप कर सकते हैं फिर स्ट्रिंग के भीतर स्थिति खोजने के लिए strpos() का उपयोग करें। – SenorAmor

उत्तर

59

आप उस के लिए झंडा PREG_OFFSET_CAPTURE उपयोग कर सकते हैं:

preg_match('/(bar)/', 'Foobar', $matches, PREG_OFFSET_CAPTURE); 
var_export($matches); 

परिणाम है:

array (
    0 => 
    array (
    0 => 'bar', 
    1 => 3,  // <-- the string offset of the match 
), 
    1 => 
    array (
    0 => 'bar', 
    1 => 3, 
), 
) 
+0

यह परिणाम दो बार क्यों लौटा? – ananda

+2

@ananda यह पहला मैच नियमित अभिव्यक्ति का * सभी * है। दूसरा पहला कैप्चर समूह है। संयोग से, दोनों उपरोक्त कोड में समान हैं। यदि, उदाहरण के लिए, रेगेक्स '/ Foo (बार) /' था, तो पहला परिणाम शून्य के ऑफसेट के साथ '' Foobar 'होगा और दूसरा परिणाम' बार '(ऑफसेट तीन के साथ) होगा ऊपर। –

4

preg_match एक वैकल्पिक झंडा, PREG_OFFSET_CAPTURE है, उस मैच के घटना की स्ट्रिंग स्थिति रिकॉर्ड मूल में 'भूसे के ढेर'। 'झंडे' अनुभाग देखें: http://php.net/preg_match

0

preg_match() पर PREG_OFFSET_CAPTURE के उपयोग के साथ आपको पैटर्न पर मिलान पर कई बार मिलेगा। जब कोई मैच होता है तो इसमें ऑफसेट मान होगा जो 0.

इस मान का उपयोग करके आप ऑफ़सेट पैरामीटर का उपयोग करके preg_match को फिर से कॉल कर सकते हैं।

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