2009-06-15 8 views
8

किसी को भी अपने हाथ की कोशिश करना चाहते मैच के लिए दोनों:नियमित अभिव्यक्ति एक regex से मेल खाता है के साथ आ में दोनों सापेक्ष और निरपेक्ष यूआरएल

मैं इसे एक regex के साथ यह करने के लिए असंभव हो सकता है लगता है, लेकिन आप कभी पता नहीं।

संपादित करें: स्पष्टीकरण के लिए, मैं जो करने की कोशिश कर रहा हूं वह सभी यूआरआई को किसी दस्तावेज़ से (HTML दस्तावेज़ नहीं) चुनता है।

उत्तर

1
(http:/)?(/[\w.]+)+/? 

इनसे मेल खाता है, लेकिन हो सकता है कि आपको दिमाग में कठोर परिस्थितियां हों?

2
(http:\/)?(\/[\w\.\-]+)+\/? 

एलेक्स के समान।

+0

हममम जावास्क्रिप्ट के लिए क्या कर सकते हैं है, के अलावा अपने अधिक गहन भागने से, मुझे लगता है कि आप मिलान कर रहे हैं 'http :/'सब कुछ अपने आप पर - आप निश्चित रूप से चाहते हैं कि * मेरे + के बजाय? –

+0

यह एक बहुत दूर लालची लगता है। मैं लगभग 500k सफेद जगह के साथ समाप्त हुआ। – FlySwat

+0

@ एलेक्स गुड कॉल। संपादित। –

2

यह एक मुश्किल है क्योंकि यूआरएल में बहुत से वैध पात्र हैं (यूआरएल एन्कोड किए जाने से पहले)।

(http:/|https:/)?(/[^\s"'<>]+)+/? 

इसके अलावा एलेक्स के लिए इसी तरह की:

यहाँ मेरी शॉट है। एलेक्स के साथ मुझे मिली एकमात्र समस्या यह है कि यह पाउंड संकेत, डैश, सामान जैसी चीजों से मेल नहीं खाती है। जबकि मेरा पूरा मिलान होगा।

EDIT - असल में केवल एक चीज जो इसे बहुत लालची होने से रोकती है वह है कि व्हाइटस्पेस, उद्धरण, apostrophes, या शेवर से मेल नहीं करने के लिए निर्देश है। इस उत्तर के लिए

+0

बहुत लालची: http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> FlySwat

+0

ओह ... गॉचा। मैंने अभी इसे अपडेट किया है। शायद यह बेहतर है। –

+0

अभी भी बहुत लालची है, पिछला '' के '/ a' को खींचता है यदि यह एक HTML लिंक था – philfreo

8
(
    ((http|https|ftp)://([\w-\d]+\.)+[\w-\d]+){0,1} // Capture domain names or IP addresses 
    (/[\w~,;\-\./?%&+#=]*)    // Capture paths, including relative 
) 

दलील:

  1. पूरी बात वर्गीकृत किया जाता है, तो आप पूरा URL
  2. प्रोटोकॉल भाग वैकल्पिक है बाहर ले सकते हैं, लेकिन अगर प्रदान की है, एक होस्टनाम या IP पता होना चाहिए भी प्रदान किया जाएगा (जिनमें से दोनों को यूआरआई के बाकी हिस्सों की तुलना में कम अनुमति दी गई है)।
  3. शुरुआत में "/" भी वैकल्पिक है। पथ "छवियों/1.gif" रूप में हो सकते हैं, जो मेजबाननाम के सापेक्ष वर्तमान पथ के सापेक्ष हैं।

चेतावनियां:

  1. mailto और फ़ाइल यूआरआई समर्थित नहीं है।
  2. एक अवधि (जैसे उद्धरण के बिना वाक्य के अंत में) यूआरएल पिछली अवधि में शामिल होगा।
  3. उपरोक्त # 3 की वजह से, यह सभी प्रकार की चीजों को कैप्चर करने जा रहा है। यदि आप सत्यापित कर सकते हैं कि सभी पथ रिश्तेदार नहीं हैं, तो आप कोष्ठक के बाहर "/" जोड़ सकते हैं और इस प्रकार इसकी आवश्यकता होती है।
  4. यदि सभी यूआरआई HTML विशेषताओं (ए, लिंक, आईएमजी, आदि) के भीतर हैं, तो आप केवल यूआरआई को उद्धरण के भीतर कैप्चर करके या कम से कम केवल HTML टैग के भीतर लक्षित कर सकते हैं।

संपादित करें: व्हाउप्स, निश्चित समापन माता-पिता की समस्या।

+0

अपनी अभिव्यक्ति की जांच करें, यहां तक ​​कि टिप्पणियों को हटाने के बाद भी संकलित नहीं किया जाएगा। – FlySwat

+1

इसके अंत में एक गायब संश्लेषण है। यह होना चाहिए ... (((http | https | एफ़टीपी): // (। [\ डब्ल्यू \ घ] \) + [\ डब्ल्यू \ d] +) {0,1} (/ [\ w ~,; \ - \ ./ ?% और + # =] *)) वैसे, यह http://regexhero.net/ - एक बड़ा समय बचतकर्ता पर सत्यापित किया गया था। –

+0

ध्यान दें कि यदि URL HTML में हैं, तो यह विफल हो जाता है, \ 0' पिछला '' शामिल है। – philfreo

0

आसान नहीं है और आप शायद होने अंत "बहुत ज्यादा URI" catched, तथापि किस बारे में:

((http://|https://)([^/])+)*(/([^\s])*(/))(((\w)*\.[\w]{3,10})|(\w+))? 

मूल रूप से तुम वहाँ समूहों की एक जोड़ी है। प्रोटोकॉल को परिभाषित करने पर। कोई निर्देशिका की तलाश में है और एक अंत में एक फ़ाइल की तलाश में है। परंतु! यह दृष्टिकोण बहुत सीमित है। यदि आपको वास्तविक यूआरआई सत्यापन की आवश्यकता है और! अलगाव (बंदरगाह, उपयोगकर्ता नाम, पासवर्ड, अवांछित पात्रों को फ़िल्टर करें!) आप शायद अधिक जटिल अभिव्यक्ति के साथ समाप्त हो जाएंगे। सौभाग्य!

अद्यतन:

आप उन लोगों regex बारे में अधिक जानने के लिए इच्छुक खोज इंजन से आने के लिए इस के लिए नहीं कहा था, हालांकि मैं इस मुफ्त कार्यक्रम मैं इस प्रयास के लिए इस्तेमाल किया प्लग करने के लिए चाहते हैं "The Regex Coach" (नहीं, संबद्ध नहीं)।

+0

यह वास्तव में जो कुछ मैं चाहता हूं उससे मेल खाने वाला सबसे नज़दीकी लगता है, हालांकि "कब्जा" क्या है आमतौर पर ju सेंट "/" और पूरे यूआरआई नहीं। – FlySwat

+0

क्योंकि www.google.com, cool.com या www.test.us/test को एक निश्चित परिप्रेक्ष्य से वैध यूआरआई के रूप में भी देखा जा सकता है, मैं निम्नलिखित अभिव्यक्ति का सुझाव देता हूं: ([^ \ s] + [/।] + [^\ s] +) यह तब तक नियमित बिल्ड वाक्यों में असफल हो जाएगा जब तक कि एक सफेद जगह है। – merkuro

+0

नहीं ... रिटर्न: '/ foo/bar"> baz philfreo

0

मैंने नामकरण कैप्चर समूहों का उपयोग किया। योजना मौजूद होने पर हमें बेहतर मिलान मिलते हैं। Www.foo.com/bar की तरह ही मिलान/बार होगा।

(?: 
    (?:(?<scheme>https?|file)://) 
    (?<host>[^/]+) 
    (?<path>/(?:[^\s])+)? 
) 
| 
(?<path>/(?:[^\s])+) 

यह आपको

var result = text.match(/(?:(?:(https?|file):\/\/)([^\/]+)(\/(?:[^\s])+)?)|(\/(?:[^\s])+)/g); 

टेस्ट डेटा

sadfasdf /foo/bar/ba090z.gif asdfasdf /foo/bar/ sadfasdf asdflkj; http://www.foo.com/foo/bar some stuff http://user:[email protected]:80/r?stuff%20stuff 

user:[email protected]:80/r?stuff%20stuff 
संबंधित मुद्दे