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

$str = '- 10 TEST (FOO 3 TEST.BAR 213 BAZ (\HELLO) TEST';

preg_match('/FOO (\d+).+BAR (\d+).+BAZ \(\\\\(\w+)\)/i', $str, $match);

$str = '- 10 TEST (FOO 3 TEST.BAR 213 BAZ () TEST';
$array = array(
    'FOO' => 3,
    'BAR' => 213,
    'BAZ' => 
);
2
shareds 15 मार्च 2011, 01:01
ऑपरेटर '?' का उपयोग करना शायद? मुझे ठीक से समझ नहीं आ रहा है कि आप क्या चाहते हैं
 – 
Fran Verona
15 मार्च 2011, 01:03
आपका पिछला प्रश्न कहाँ गया था?
 – 
mario
15 मार्च 2011, 06:56

2 जवाब

सबसे बढ़िया उत्तर

ऐसा लगता है कि आप पूरी चीज़ को एक गैर-कैप्चरिंग समूह में लपेटना चाहते हैं और एक ? ऑपरेटर जोड़ना चाहते हैं।

/FOO (\d+).+BAR (\d+).+BAZ (?:\(\\\\(\w+)\))?/i

ध्यान दें कि यह बीएजेड को इसके बाद बिना किसी कोष्ठक के कैप्चर करता है। यदि आप इसके बजाय BAZ () ढूंढ रहे हैं, तो इसका उपयोग करें:

/FOO (\d+).+BAR (\d+).+BAZ \((?:\\\\(\w+))?\)/i
1
Justin Morgan 15 मार्च 2011, 01:05

कुछ वैकल्पिक बनाने के लिए आप इसे गैर-कैप्चरिंग समूह (?: ... ) में रख सकते हैं और फिर समूह के बाद एक प्रश्न चिह्न लगा सकते हैं। प्रश्न चिह्न एक क्वांटिफायर है जिसका अर्थ है "शून्य या एक"।

दूसरे शब्दों में, इसे बदलें:

\\\\(\w+)

इसके लिए:

(?:\\\\(\w+))?

तो पूरी अभिव्यक्ति बन जाती है:

/FOO (\d+).+BAR (\d+).+BAZ \((?:\\\\(\w+))?\)/i
1
Mark Byers 15 मार्च 2011, 01:04