2010-01-08 10 views
8

मैं यूआरएल का एक सेट है एक छोटे यूआरएल के साथ अपने खाते के पेज तक पहुंचें:नियमित एक्सप्रेस: ​​एकाधिक वर्ण समूहों को कैसे बाहर निकालना है?</p> <blockquote> <p>/उत्पादों</p> <p>/श्रेणियों</p> <p>/ग्राहकों</p> </blockquote> <p>अब एक ग्राहकों जॉन नाम है कहते हैं, और मैं करने के लिए जॉन मदद करना चाहते हैं:

before : /customers/john 
after : /john 

(मान लीजिए ग्राहक नाम अद्वितीय हैं)

मैं तो सभी ग्राहकों के लिए इस सुविधा हो सकता है एक उचित regex डिस्पैचर यह पता लगाने की कोशिश कर रहा हूँ:

/marry 
/james 
/tony-the-red-beard 
यहाँ

क्या मैं अब मिल गया (PHP में) है:

'/^\/([^(products|categories|admin)].+)$/' => /customers/$1 

यह काम करने के लिए प्रतीत नहीं होता। कोई मेरी मदद कर सकता है?

+0

नियमित एक्सप्रेस पर सभी! Prunes और दलिया! –

उत्तर

16

आपको यहां क्या चाहिए इसकी एक नकारात्मक लुकहेड assertion है। आप क्या कहना चाहते हैं "मैं इन विशेष तारों को छोड़कर, पात्रों की किसी भी स्ट्रिंग से मेल खाना चाहता हूं।" रेगेक्स में एक कथन एक स्ट्रिंग के खिलाफ मिल सकता है, लेकिन यह किसी भी चरित्र का उपभोग नहीं करता है, जिससे उन वर्णों को आपके शेष रेगेक्स से मिलान किया जा सकता है। आप (?! और ) में पैटर्न को लपेटकर एक नकारात्मक दावा निर्दिष्ट कर सकते हैं।

'/^\/(?!products|categories|admin)(.+)$/' 

नोट आप निम्नलिखित बजाय चाहते हो सकता है कि यदि आप ग्राहकों के नाम स्लैश शामिल करने के लिए अनुमति नहीं देते:

'/^\/(?!products|categories|admin)([^/]+)$/' 
0

आप किसी नकारात्मक चरित्र वर्ग को गलत तरीके से उपयोग करने का प्रयास कर रहे हैं। एक अस्वीकृत चरित्र वर्ग कहता है 'निहित पात्रों से मेल न करें'। आप जो कहना चाहते हैं वह है 'अगर मैं यहां निर्दिष्ट सामग्री को मौजूद करता हूं तो मेल नहीं खाता'। ऐसा करने के लिए आपको थोड़ा अधिक रचनात्मक होना है। शायद कुछ नकारात्मक दिखने की जरूरत है। मैं php के regex इंजन के बारे में 100% निश्चित नहीं हूं लेकिन इसके समान कुछ काम करना चाहिए।

/^\/(?<!(?:products|categories|admin))(.+)$/ 

हां, तो नकारात्मक lookbehind (?<! ...) कहावत से मेल नहीं .+ अगर products या categories या admin यह पूर्व में होना है। फिर वह गैर-कैप्चरिंग समूह (?: ...) में है।

अतिरिक्त सहायता के लिए Regular Expression Advanced Syntax Reference देखें।

+0

एर, आपको दिखने के रूप में फैंसी के रूप में जाने की आवश्यकता नहीं है (और वास्तव में, मुझे नहीं लगता कि यह काम करेगा, क्योंकि आपने अभी तक उन पात्रों का उपभोग नहीं किया है), और नकारात्मक दावे हमेशा गैर-कैप्चरिंग होते हैं, क्योंकि, अच्छा, वे नकारात्मक हैं; वे क्या पकड़ेंगे? –

+0

ब्रायन के संकेत के लिए धन्यवाद, यहां आपके कथन के लिए एक संभावित फिक्स है: /^\/(.+)(? Shawn

+0

@ क्यूबर्टिकस: एक ही प्रभाव लेकिन दावा का उपयोग करना अधिक सहज है। – Shawn

6

यह पूरी तरह से समस्या को हल करने के बारे में जाने के लिए गलत तरीके से है, लेकिन यह ऋणात्मक लुकहेड का उपयोग किए बिना निश्चित नकारात्मक लुकहेड व्यक्त करना संभव है। स्पष्टता के लिए अतिरिक्त अंतर:

^ (
($ | [^/] | 
/($ | [^pc] | 
    p ($ | [^r] | 
     r ($ | [^o] | 
     o ($ | [^d] | 
      d ($ | [^u] | 
      u ($ | [^c] | 
       c ($ | [^t] | 
       t ($ | [^s]))))))) | 
    c ($ | [^au] | 
     a ($ | [^t] | 
     t ($ | [^e] | 
      e ($ | [^g] | 
      g ($ | [^o] | 
       o ($ | [^r] | 
       r ($ | [^i] | 
        i ($ | [^e] | 
        e ($ | [^s])))))))) | 
     u ($ | [^s] | 
     s ($ | [^t] | 
      t ($ | [^o] | 
      o ($ | [^m] | 
       m ($ | [^e] | 
       e ($ | [^r] | 
        r ($ | [^s])))))))))) 
) .*) $ 
+2

वाह। मुझे यकीन नहीं है कि मुझे प्रभावित होना चाहिए या परेशान होना चाहिए। हाँ, नियमित अभिव्यक्तियों में नकारात्मक दिखना संभव है, यहां तक ​​कि यदि उनके लिए कोई वाक्य रचनात्मक चीनी नहीं है, तो जुस टी चरित्र चरित्रों के बिना पात्रों की एक पूरी श्रृंखला से मेल खाना संभव है। मुझे यकीन नहीं है कि आप क्यों लिखना चाहते हैं '(ए | बी | सी | डी | ई | एफ | जी | एच | आई | जे | के | एल | एम | एन | ओ | पी | क्यू | आर | एस | टी | यू | v | w | x | y | z | एक | B | C | D | E | F | G | H | मैं | जम्मू | कश्मीर | एल | एम | एन | हे | P | क्यू | आर | एस | टी | यू | वी | डब्ल्यू | एक्स | वाई | जेड) '' ए-जेए-जेड] 'के बजाय, और इसी तरह मुझे यकीन नहीं है कि आप नकारात्मक दिखने वाले दावों से क्यों बचना चाहते हैं ' (?!) '। –

+0

नहीं .. मैं बस डर गया हूँ। मेरा मानना ​​है कि एक बेहतर समाधान है। इसके अलावा वह दुनिया का अंत नहीं है। – Shawn

+4

बस मस्ती के लिए, वास्तव में, क्योंकि किसी और ने पहले से ही सही उत्तर पोस्ट किया है। – ephemient

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