पीएचपी अग्रदर्शी अभिव्यक्ति का समर्थन करता है: मैं की तरह हर क्रमचय लिखना चाहता हूँ नहीं है। आप शायद उन्हें सही ढंग से उपयोग नहीं कर रहे हैं, हालांकि।
मान लें कि आप एक स्ट्रिंग है कि सभी 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
स्ट्रिंग के अंत में मिलान करने में सफल होता है क्योंकि प्रत्येक कैप्चरिंग समूहों में खाली स्ट्रिंग के अलावा कुछ भी नहीं होता है।
स्रोत
2011-11-22 22:09:58
मुझे लगता है कि आपको regexes – DiogoDoreto
उम्मम को विभाजित करने की आवश्यकता होगी। PHP समर्थन करता है '(? = ...)': http://php.net/manual/en/regexp.reference.assertions.php –