2014-12-26 4 views
5

मैं इन यूआरएल (12345678 और 1234567890) में संख्याओं से मेल खाने के लिए रेगेक्स लिखने की कोशिश कर रहा हूं।इन यूआरएल से संख्या निकालने के लिए रेगेक्स कैसे लिखें?

http://www.example.com/p/12345678 
http://www.example.com/p/12345678?foo=bar 
http://www.example.com/p/some-text-123/1234567890?foo=bar 

नियम:

  • संख्या हमेशा एक स्लैश के बाद आ
  • अलग अलग संख्या लंबाई
  • regex जांच करनी चाहिए कि यूआरएल /p/ उन में
  • नंबर हो सकता है यूआरएल के अंत में हो सकता है, या
के बाद चर हो सकता है

मेरे प्रयास:

\/p\/([0-9]+) 

कि पहले और दूसरे, लेकिन तीसरे नहीं मेल खाता है। तो मैंने कोशिश की:

\/p\/[^\/?]*\/?([0-9]+) 

कोई खुशी नहीं।

REGEX 101

+2

क्या regex इंजन आप में इस का उपयोग किया जा रहे हैं (क्या प्रोग्रामिंग भाषा?) –

+0

"\/[^ \ घ]"? या यहां तक ​​कि सिर्फ "[^ \ d]" या "[^ \ d +]" मैं विश्वास करता हूं कि चाल है? – Adam

+0

@MichaelBerkowski PHP – Nate

उत्तर

2

Regex इस काम के लिए सही उपकरण नहीं हो सकता है। यह हर मामले में दिखता है, यूआरएल पार्सर के साथ यूआरएल को विभाजित करने से ज्यादा समझदारी होगी। आपके उदाहरणों से, ऐसा प्रतीत होता है कि यूआरएल के पथ भाग में संख्या भाग हमेशा अंतिम वस्तु है। मुझे यकीन नहीं है कि आप किस भाषा का उपयोग कर रहे हैं, लेकिन कई भाषाएं ऐसे कार्यों की पेशकश करती हैं जो यूआरएल को उनके घटक भागों में पार्स कर सकती हैं।

$path = parse_url($url, PHP_URL_PATH); 
if(strpos($path, "/p/") === 0) { 
    $base = basename($path); 
} else { 
    // error 
} 

हर बार काम करता है, मानते हुए कि $ url वह स्ट्रिंग है जिसे आप पार्स कर रहे हैं।

+0

'parse_url' पर अनावश्यक कॉल को निकालने के लिए संपादित किया गया। 'parse_url' को फिर से कॉल करने के बजाय' $ path' को बेसनाम पर पास किया जा सकता है। – superultranova

1

मैं अपने संस्करण बढ़ाया, अब यह सब उदाहरण के साथ काम करता है:

\/p\/(.+\/)*(\d+)($|\?) 

https://regex101.com/r/pW5qB3/2:

\/p\/(.+\/)*(\d+)(\?.+=.+(&.+=.+)*)?$ 

आप परवाह नहीं है अगर वह URL वैध है, तो आप करने के लिए regex हटना सकता है

+0

अंत में सभी चीजें वास्तव में जरूरी नहीं हैं, क्योंकि यह केवल '/ p/'और' \ d + 'है जो यहां मायने रखती हैं। –

+1

@ माइकल बर्ककोस्की लेकिन ओपी ने उल्लेख किया कि संख्या यूआरएल का अंतिम भाग होना चाहिए, केवल तर्क ही हो सकते हैं, इसलिए यह सुनिश्चित करता है कि यूआरएल वैध है और केवल – msrd0

+0

संख्या के बाद पैरामीटर आते हैं, वास्तव में यह सच है। आप बस '($ | \?)' के साथ इसका अनुसरण कर सकते हैं, इसलिए या तो एक क्वेरी स्ट्रिंग या स्ट्रिंग का अंत अगला आता है। 'Key = value और key = value' –

-2
var regex = new Regex(@"/(?<ticket>\d+)"); 

var subject = "http://www.example.com/p/some-text-123/1234567890?foo=bar"; 

var ticket = regex.Match(subject).Groups["ticket"].Value; 

आउटपुट: 1234567890

+2

से मेल खाएगा यह उन यूआरएल से मेल खाएगा जिनमें '/ p /' शामिल नहीं है, जो आवश्यक है। –

0

अगर मैं अच्छी तरह से समझ, अंक आप केवल हो सकता हैं:

  • सही होने के बाद यूआरएल के अंतिम स्लेश
  • , चर का हिस्सा नहीं हो सकता यानी /p/123?foo=bar456 मैचों 123 और
    /p/foobar?foo=bar456 कुछ भी नहीं
  • से मेल खाता है

    (?=/p/).*/\K\d+ 
    
    :

फिर आप निम्नलिखित regex का उपयोग कर सकते हैं

स्पष्टीकरण

(?=/p/) # lookahead: check '/p/' is in the URL 
.*/  # go to the last '/' thanks to greediness 
\K  # leave everything we have so far out of the final match 
\d+  # select the digits just after the last '/' 

आगे भागने स्लैश regex delimiters के रूप में उन्हें का उपयोग नहीं करते बचने के लिए: #(?=/p/).*/\K\d+# ठीक करेंगे।

demo here देखें।

0
\/p\/(?:.*\/)?(\d+)\b 

आप इसे आजमा सकते हैं। यह आपके कोडिटन के आधार पर पूर्णांक कैप्चर करेगा। डेमो देखें। कैप्चर या समूह को पकड़ें।

https://regex101.com/r/dU7oN5/29

$re = "/\\/p\\/(?:.*\\/)?(\\d+)\\b/"; 
$str = "http://www.example.com/p/12345678\nhttp://www.example.com/p/12345678?foo=bar\nhttp://www.example.com/p/some-text-123/1234567890?foo=bar"; 

preg_match_all($re, $str, $matches); 
संबंधित मुद्दे