जावास्क्रिप्ट में सबसे छोटा यूआरएल रेगेक्स मैच


16

जावास्क्रिप्ट में चलने पर सबसे छोटी नियमित अभिव्यक्ति बनाएं जो मोटे तौर पर पाठ में URL से मेल खाएगी

उदाहरण:

"some text exampley.com".match(/your regular expression goes here/);

नियमित अभिव्यक्ति की जरूरत है

  • सभी मान्य URL को कैप्चर करें जो http और https के लिए हैं।
  • चिंता न करने वाले URL के लिए मेल खाने की चिंता न करें जो वास्तव में मान्य URLS नहीं हैं super.awesome/cool
  • जावास्क्रिप्ट रेगेक्स के रूप में चलने पर मान्य हो

परीक्षण मानदंड:

मिलान करें:

मेल नहीं करता:

  • उदाहरण
  • बेहद कूल
  • शुभ प्रभात
  • हाँ मैं
  • नमस्कार।

यहाँ एक परीक्षण है जो थोड़ा स्पष्ट करने में मदद कर सकता है http://jsfiddle.net/MikeGrace/gsJyr/

मैं स्पष्टता की कमी के लिए माफी माँगता हूँ, मुझे एहसास नहीं हुआ था कि मिलान करने वाले URL कितने भयानक थे।


Ahgrrrr! मुझे अपने संपादित विशेषाधिकार याद हैं! मैं खेल को एक भाषा तक सीमित रखने जा रहा हूं, शायद आपको इसे उस भाषा के साथ टैग करना चाहिए।
dmckee --- पूर्व-मध्यस्थ ने बिल्ली

एक मान्य URL वर्ण क्या बनता है? क्योंकि मैं बस \wसब कुछ के लिए उपयोग कर सकता हूं क्या आप अलग-अलग URL घटकों के लिए बैकरेफ़रेंस की अपेक्षा करते हैं?
मिंग-तांग

1
के अनुसार "एक यूआरआई एक बहुत ही सीमित सेट से वर्णों का एक क्रम है, बुनियादी लैटिन वर्णमाला, अंक, और कुछ विशेष वर्ण का पत्र है यानी," आरएफसी 2396
RunnerRick

माइक: मुझे लगता है कि क्रम में अभी भी कुछ स्पष्टीकरण है। जैसा कि यह अब खड़ा है मैं बस /:/नियमित अभिव्यक्ति के रूप में उपयोग कर सकता हूं और वैध यूआरआई से मिलान कर सकता हूं और »नहीं मैच« सूची पर अपने सभी उदाहरणों का मिलान कर सकता हूं । जब तक आप उस मार्ग पर जा रहे हैं, यह बस सवाल है: सबसे छोटी नियमित अभिव्यक्ति क्या है जो किसी भी उदाहरण के तार से मेल नहीं खाएगी लेकिन फिर भी सभी यूआरआई को पकड़ लेगी।
जॉय

1
बस अधिक विवरण के साथ एक लंबी चुनौती लिखने का प्रयास करें।

जवाबों:


1
/.+\.\w\w.*/

3 स्ट्रिंग्स से मेल नहीं खाता है कि यह नहीं होना चाहिए, लगभग किसी भी चीज़ से मेल खाता है;)
अपडेट: यह अभी भी सभी 5 से मेल नहीं खाता है


14

यह एक काम करता है:

var re = /(^|\s)((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/\S*)?)/gi;

/*
(^|\s)                            : ensure that we are not matching an url 
                                    embeded in an other string
(https?:\/\/)?                    : the http or https schemes (optional)
[\w-]+(\.[\w-]+)+\.?              : domain name with at least two components;
                                    allows a trailing dot
(:\d+)?                           : the port (optional)
(\/\S*)?                          : the path (optional)
*/

पर परीक्षणों को पास करता है http://jsfiddle.net/9BYdp/1/

यह भी मेल खाता है:

  • example.com। (अनुगामी डॉट)
  • example.com:8080 (पोर्ट)

मिठास !!!!!!!
माइक अनुग्रह

2
क्या आप केवल एक घटक (जैसे कि लोकलहोस्ट) के साथ एक होस्टनाम का मिलान नहीं करना चाहेंगे?
रनरॉक

यह रिक्त स्थान की अनुमति देता है
brenjt

मेरे लिये कार्य करता है। ty :)
STEEL

अच्छा काम करता है, लेकिन उपयोगकर्ता / पासवर्ड भागों जैसे डोमेन के लिए नहींhttp://user:password@domain.com/path
Radon8472

5

यह स्पष्ट रूप से वह नहीं करता है जो आप चाहते हैं, लेकिन यह आपके मानदंडों को पूरा करता है:

 /.*/
  • "सभी मान्य URL से मिलान करें जो http और https के लिए हैं।"

    हाँ, निश्चित रूप से मैच होगा।

  • "URL के लिए मेल नहीं खाने के बारे में चिंता न करें जो स्ट्रिंग्स वास्तव में मान्य URLs जैसे 'super.awesome / cool' नहीं हैं"

    हाँ, निश्चित रूप से, बहुत सारी झूठी सकारात्मकताएँ होंगी , लेकिन आपने कहा कि कोई बात नहीं।

  • जावास्क्रिप्ट रेगेक्स के रूप में चलने पर मान्य हो

    यकीन है कि अंडे के रूप में आप कहते हैं कि यह काम करना चाहिए।

यदि यह परिणाम सही उत्तर नहीं है, तो आपको अपने मानदंडों के साथ अधिक चयनात्मक होने की आवश्यकता है।

एक नियम के रूप में जो आपके इरादे के अनुसार काम करता है, आपको वास्तव में एक पूर्ण RFC अनुरूप मिलानकर्ता को लागू करने की आवश्यकता है, और एक पूर्ण RFC अनुरूप मिलान "मिलान न करने की चिंता" करेगा।

तो, "अनुमति नहीं मिलान" के संदर्भ में, आपको यह निर्दिष्ट करने की आवश्यकता है कि RFC के कौन से विचलन अनुमेय हैं।

और कुछ भी, और यह पूरी कवायद एक दिखावा है, क्योंकि लोग सिर्फ उनके लिए जो भी काम करेंगे, या वे इसे कैसे पसंद करेंगे, और संक्षिप्त होने के पक्ष में "कोई मतलब नहीं" का त्याग करते हैं (जैसे मैंने किया)।

आपके अपडेट पर

सबसे Na mostve regex मैं उस मैच के साथ आ सकता हूं (और कैप्चर करता है) आपके सभी अब तक के उदाहरण हैं:

/(\S+\.[^/\s]+(\/\S+|\/|))/g;

इसकी प्रकृति में काफी सरल है, और केवल 3 मूल रूपों को मानता है।

x.y
x.y/
x.y/z 

zव्हॉट्सएप नहीं कुछ भी हो सकता है। xव्हॉट्सएप कुछ भी नहीं हो सकता है। yऐसा कुछ भी हो सकता है जो न तो व्हाट्सएप हो और न ही '/' अक्षर।

बहुत सारी चीजें हैं जो इस नियम के लिए मान्य होंगी, बहुत सी, लेकिन वे कम से कम एक वैध यूआरआई की तरह दिखेंगे एक मानव के लिए, वे सिर्फ विनिर्देशों के अनुरूप नहीं होंगे।

उदाहरण के लिए:

hello.0/1  # valid 
1.2/1 # valid 
muffins://¥.µ/€  # probably valid

मुझे लगता है कि समझदार दृष्टिकोण उन चीजों को निकालने के लिए है जो यूआरआई होने की संभावना रखते हैं, फिर उन्हें कुछ सख्त करने के साथ मान्य करें, मैं काम कर रहा हूं कि ब्राउज़र यूआरआई वर्ग का उपयोग कैसे करें उन्हें मान्य करने के लिए =)।

लेकिन आप इस नमूने पर काम करने वाले उपरोक्त तर्क यहाँ देख सकते हैं: http://jsfiddle.net/mHbXx/


उन्होंने प्रश्न को बदल दिया, लेकिन आप /:/संपादन के बाद भी कुछ भी बेहतर कर सकते हैं :-)
जॉय

धन्यवाद माइक =)। मैं अपने आप को अधिक गंभीर तरीके से प्रतिस्पर्धा नहीं करना चाहता, अन्य सुझाव अधिक उपयोगी हैं, मैं सिर्फ प्रारंभिक आधार के साथ समस्या को इंगित करना चाहता हूं ताकि प्रश्न गुणवत्ता में सुधार हो सके =)
केंट फ्रेड्रिक

क्या यह केवल मैं हूं या यह "www .google .com" से मेल खा रहा है?
शियाविनी

1
/https?\:\/\/\w+((\:\d+)?\/\S*)?/

उसकी कोशिश करो।

मैं अग्रणी और अनुगामी स्लैशों को शामिल करता हूं जो नियमित अभिव्यक्ति को परिसीमित करते हैं, इसलिए उम्मीद है कि मेरे चरित्र की गिनती को चोट न पहुंचे!

यह पैटर्न प्रोटोकॉल को http या https तक सीमित करता है, एक वैकल्पिक पोर्ट नंबर की अनुमति देता है, और फिर व्हाट्सएप को छोड़कर किसी भी वर्ण को अनुमति देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.