2011-11-22 15 views
5

मैं अपनी नियमित अभिव्यक्ति में एक प्रकार का लॉजिकल ऑपरेटर "और" का उपयोग करना चाहता हूं। मैं इस कोशिश की:लॉजिकल ऑपरेटर और PHP नियमित अभिव्यक्ति

(?=exp1)(?=exp2) 

लेकिन पीएचपी ?= में काम नहीं करता और PHP भाषा में मेरे प्रोग्राम लिखने के लिए की जरूरत है। क्या कोई और तरीका है? यदि सभी स्थितियों और किसी भी क्रम में मौजूद हैं तो अभिव्यक्ति का मिलान करना होगा।

(exp1)(exp2)(exp3)|(exp1)(exp3)(exp2)|.... 
+0

मुझे लगता है कि आपको regexes – DiogoDoreto

+4

उम्मम को विभाजित करने की आवश्यकता होगी। PHP समर्थन करता है '(? = ...)': http://php.net/manual/en/regexp.reference.assertions.php –

उत्तर

9

पीएचपी अग्रदर्शी अभिव्यक्ति का समर्थन करता है: मैं की तरह हर क्रमचय लिखना चाहता हूँ नहीं है। आप शायद उन्हें सही ढंग से उपयोग नहीं कर रहे हैं, हालांकि।

मान लें कि आप एक स्ट्रिंग है कि सभी foo, bar और baz के तीन शामिल मिलान करना चाहते हैं, तो आप regex

^(?=.*foo)(?=.*bar)(?=.*baz) 

यह तार foobarbaz या barbazfoo आदि हालांकि, उस मैच के लिए एक मैच वापस आ जाएगी की जरूरत है खाली स्ट्रिंग होगी (क्योंकि लुकहेड किसी भी पात्र का उपभोग नहीं करते हैं)। आप रेगुलर एक्सप्रेशन से स्वयं स्ट्रिंग वापस जाने के लिए चाहते हैं,

^(?=.*foo)(?=.*bar)(?=.*baz).* 

जो तब पूरी स्ट्रिंग के मिलान करेगा कि क्या यह सभी तीन मानदंडों को पूरा करता का उपयोग करें।

मैं बस

if (preg_match('/^(?=.*foo)(?=.*bar)(?=.*baz)/s', $subject)) { 
    # Successful match 
} else { 
    # Match attempt failed 
} 

लें ध्यान दें कि यह भी foonly bartender bazooka इस तरह की स्ट्रिंग से मेल खाएगी का प्रयोग करेंगे। यदि आप नहीं चाहते हैं, आप एक छोटे से चाल के साथ यह कर सकते हैं (केवल एक से तीन भाव से प्रत्येक के शुद्ध क्रमपरिवर्तन की अनुमति):

^(?:foo()|bar()|baz()){3}\1\2\3$ 

मैचों foobarbaz, foobazbar, barfoobaz, barbazfoo, bazfoobar और bazbarfoo (और कुछ नहीं)। "चाल" जन गोवार्ट्स और स्टीवन लेविथन की उत्कृष्ट पुस्तक "Regular Expressions Cookbook" (पृष्ठ 304) से प्रेरित है।

  • प्रत्येक आवश्यक हिस्सा (foo आदि) एक खाली कैप्चरिंग समूह () जो हमेशा से मेल खाता है, तो आवश्यक हिस्सा मिलान किया गया है द्वारा पीछा किया जाता: यह इस प्रकार काम करता है।
  • तो यदि सभी तीन आवश्यक भागों का मिलान हो गया है, तो सभी तीन खाली कैप्चरिंग समूहों का मिलान हुआ है।
  • निम्नलिखित बैकरेक्शन केवल तभी सफल होते हैं जब प्रत्येक कैप्चरिंग समूह ने मैच में भाग लिया हो।
  • तो यदि स्ट्रिंग foobarbar है, तो भाग (?:foo()|bar()|baz()){3} मिलान होगा, लेकिन \3 विफल हो जाता है, इसलिए समग्र regex विफल रहता है।
  • यदि, हालांकि, तीनों ने मैच में भाग लिया, \1\2\3 स्ट्रिंग के अंत में मिलान करने में सफल होता है क्योंकि प्रत्येक कैप्चरिंग समूहों में खाली स्ट्रिंग के अलावा कुछ भी नहीं होता है।
+0

अच्छा, पूरा उत्तर। +1 – FailedDev

+0

@tim क्या आप इस पर संसाधन या पूरक प्रदान कर सकते हैं? मैंने पहले कभी foo() | bar() | baz() जैसे कुछ नहीं देखा है। – bozdoz

+0

मुझे लगता है, मैं जो पूछ रहा हूं वह खाली ब्रैकेट का महत्व क्या है? – bozdoz

1

@ टिम जवाब के अलावा:

(?=exp1)(?=exp2) 

यह कभी नहीं सच हो सकता है।आप सादे अंग्रेजी में कहते हैं: सुनिश्चित करें कि यहां दिया गया पाठ exp1 है और यह भी सुनिश्चित करें कि यहां दिया गया पाठ exp2 है। कोई रास्ता यह सच नहीं है। यह कभी मेल नहीं खाएगा।

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