यदि स्ट्रिंग एक वैध URL है, तो यह जांचने के लिए सबसे अच्छी नियमित अभिव्यक्ति क्या है?


795

यदि कोई दिया गया स्ट्रिंग एक मान्य URL पता है तो मैं कैसे जांच सकता हूं?

नियमित अभिव्यक्तियों के बारे में मेरा ज्ञान बुनियादी है और मुझे उन सैकड़ों नियमित अभिव्यक्तियों में से चुनने की अनुमति नहीं है जो मैंने पहले ही वेब पर देखी हैं।


31
कोई URL या सिर्फ HTTP? उदाहरण के लिए mailto: me@example.com URL के रूप में गिना जाता है? AIM चैट लिंक?
मैकी

1
यदि किसी URL में अग्रणी "http (आदि)" नहीं है, तो आप इसे किसी अन्य मनमाने स्ट्रिंग से कैसे भेद पाएंगे जो इसमें डॉट्स होता है? "MyClass.MyProperty.MyMethod" जैसा कुछ कहें? या "मैं कुछ बार स्पेसबार को याद करता हूं। क्या यह एक समस्या है?"
तोमलक Tom

1
मैंने पहले से ही 'http: / / www' का उपसर्ग कर लिया है। टेक्स्टबॉक्स से पहले। इसलिए उपयोगकर्ता को 'http: / / www' दर्ज करने की आवश्यकता नहीं है। और केवल आवश्यक यूरी नाम दर्ज करने से संबंधित होना चाहिए।
इनपुट

1
आप किस प्रोग्रामिंग भाषा का उपयोग कर रहे हैं? आप शायद पहिए को फिर से नहीं लगाना चाहते।
एक भुगतान किया बेवकूफ

9
Microsoft में एक Regex पृष्ठ है जिसमें URL के लिए एक अभिव्यक्ति शामिल है। निश्चित रूप से एक अच्छी शुरुआत: msdn.microsoft.com/en-us/library/ff650303.aspx NB। उपरोक्त पृष्ठ सेवानिवृत्त है, लेकिन तालिका में अभिव्यक्तियाँ संदर्भ के लिए अनिवार्य रूप से मान्य हैं। URL अभिव्यक्ति की सिफारिश की (और जो मेरे लिए बहुत काम की है) है: "^ (ht। F) tp (s?) \: \ / \ / [0-9a-zA-Z] ([-। \ W] * [[ 0-9a-zA-Z]) * (:( 0-9) *) * (\ /) ([एक-zA-Z0-9 \ -।? \ \ \, \ '\ / \\\ + & amp;% \ $ # _] *)। $ "
CMH

जवाबों:


407

मैंने RFC 3987 ( http://www.faqs.org/rfcs/rfc3987.html ) का अनुपालन करने के लिए अपना URL (वास्तव में IRI, अंतर्राष्ट्रीयकृत) पैटर्न लिखा था । ये PCRE सिंटैक्स में हैं।

पूर्ण IRI के लिए (अंतर्राष्ट्रीयकृत):

/^[a-z](?:[-a-z0-9\+\.])*:(?:\/\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:])*@)?(?:\[(?:(?:(?:[0-9a-f]{1,4}:){6}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|::(?:[0-9a-f]{1,4}:){5}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|v[0-9a-f]+\.[-a-z0-9\._~!\$&'\(\)\*\+,;=:]+)\]|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}|(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=])*)(?::[0-9]*)?(?:\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))*)*|\/(?:(?:(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))+)(?:\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))*)*)?|(?:(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))+)(?:\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))*)*|(?!(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@])))(?:\?(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@])|[\x{E000}-\x{F8FF}\x{F0000}-\x{FFFFD}\x{100000}-\x{10FFFD}\/\?])*)?(?:\#(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@])|[\/\?])*)?$/i

रिश्तेदार IRI को भी अनुमति देने के लिए:

/^(?:[a-z](?:[-a-z0-9\+\.])*:(?:\/\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:])*@)?(?:\[(?:(?:(?:[0-9a-f]{1,4}:){6}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|::(?:[0-9a-f]{1,4}:){5}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|v[0-9a-f]+\.[-a-z0-9\._~!\$&'\(\)\*\+,;=:]+)\]|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}|(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=])*)(?::[0-9]*)?(?:\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))*)*|\/(?:(?:(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))+)(?:\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))*)*)?|(?:(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))+)(?:\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))*)*|(?!(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@])))(?:\?(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@])|[\x{E000}-\x{F8FF}\x{F0000}-\x{FFFFD}\x{100000}-\x{10FFFD}\/\?])*)?(?:\#(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@])|[\/\?])*)?|(?:\/\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:])*@)?(?:\[(?:(?:(?:[0-9a-f]{1,4}:){6}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|::(?:[0-9a-f]{1,4}:){5}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|v[0-9a-f]+\.[-a-z0-9\._~!\$&'\(\)\*\+,;=:]+)\]|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}|(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=])*)(?::[0-9]*)?(?:\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))*)*|\/(?:(?:(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))+)(?:\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))*)*)?|(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=@])+)(?:\/(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@]))*)*|(?!(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@])))(?:\?(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@])|[\x{E000}-\x{F8FF}\x{F0000}-\x{FFFFD}\x{100000}-\x{10FFFD}\/\?])*)?(?:\#(?:(?:%[0-9a-f][0-9a-f]|[-a-z0-9\._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!\$&'\(\)\*\+,;=:@])|[\/\?])*)?)$/i

उन्हें कैसे संकलित किया गया (PHP में):

<?php

/* Regex convenience functions (character class, non-capturing group) */
function cc($str, $suffix = '', $negate = false) {
    return '[' . ($negate ? '^' : '') . $str . ']' . $suffix;
}
function ncg($str, $suffix = '') {
    return '(?:' . $str . ')' . $suffix;
}

/* Preserved from RFC3986 */

$ALPHA = 'a-z';
$DIGIT = '0-9';
$HEXDIG = $DIGIT . 'a-f';

$sub_delims = '!\\$&\'\\(\\)\\*\\+,;=';
$gen_delims = ':\\/\\?\\#\\[\\]@';
$reserved = $gen_delims . $sub_delims;
$unreserved = '-' . $ALPHA . $DIGIT . '\\._~';

$pct_encoded = '%' . cc($HEXDIG) . cc($HEXDIG);

$dec_octet = ncg(implode('|', array(
    cc($DIGIT),
    cc('1-9') . cc($DIGIT),
    '1' . cc($DIGIT) . cc($DIGIT),
    '2' . cc('0-4') . cc($DIGIT),
    '25' . cc('0-5')
)));

$IPv4address = $dec_octet . ncg('\\.' . $dec_octet, '{3}');

$h16 = cc($HEXDIG, '{1,4}');
$ls32 = ncg($h16 . ':' . $h16 . '|' . $IPv4address);

$IPv6address = ncg(implode('|', array(
    ncg($h16 . ':', '{6}') . $ls32,
    '::' . ncg($h16 . ':', '{5}') . $ls32,
    ncg($h16, '?') . '::' . ncg($h16 . ':', '{4}') . $ls32,
    ncg($h16 . ':' . $h16, '?') . '::' . ncg($h16 . ':', '{3}') . $ls32,
    ncg(ncg($h16 . ':', '{0,2}') . $h16, '?') . '::' . ncg($h16 . ':', '{2}') . $ls32,
    ncg(ncg($h16 . ':', '{0,3}') . $h16, '?') . '::' . $h16 . ':' . $ls32,
    ncg(ncg($h16 . ':', '{0,4}') . $h16, '?') . '::' . $ls32,
    ncg(ncg($h16 . ':', '{0,5}') . $h16, '?') . '::' . $h16,
    ncg(ncg($h16 . ':', '{0,6}') . $h16, '?') . '::',
)));

$IPvFuture = 'v' . cc($HEXDIG, '+') . cc($unreserved . $sub_delims . ':', '+');

$IP_literal = '\\[' . ncg(implode('|', array($IPv6address, $IPvFuture))) . '\\]';

$port = cc($DIGIT, '*');

$scheme = cc($ALPHA) . ncg(cc('-' . $ALPHA . $DIGIT . '\\+\\.'), '*');

/* New or changed in RFC3987 */

$iprivate = '\x{E000}-\x{F8FF}\x{F0000}-\x{FFFFD}\x{100000}-\x{10FFFD}';

$ucschar = '\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}' .
    '\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}' .
    '\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}' .
    '\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}' .
    '\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}' .
    '\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}';

$iunreserved = '-' . $ALPHA . $DIGIT . '\\._~' . $ucschar;

$ipchar = ncg($pct_encoded . '|' . cc($iunreserved . $sub_delims . ':@'));

$ifragment = ncg($ipchar . '|' . cc('\\/\\?'), '*');

$iquery = ncg($ipchar . '|' . cc($iprivate . '\\/\\?'), '*');

$isegment_nz_nc = ncg($pct_encoded . '|' . cc($iunreserved . $sub_delims . '@'), '+');
$isegment_nz = ncg($ipchar, '+');
$isegment = ncg($ipchar, '*');

$ipath_empty = '(?!' . $ipchar . ')';
$ipath_rootless = ncg($isegment_nz) . ncg('\\/' . $isegment, '*');
$ipath_noscheme = ncg($isegment_nz_nc) . ncg('\\/' . $isegment, '*');
$ipath_absolute = '\\/' . ncg($ipath_rootless, '?'); // Spec says isegment-nz *( "/" isegment )
$ipath_abempty = ncg('\\/' . $isegment, '*');

$ipath = ncg(implode('|', array(
    $ipath_abempty,
    $ipath_absolute,
    $ipath_noscheme,
    $ipath_rootless,
    $ipath_empty
))) . ')';

$ireg_name = ncg($pct_encoded . '|' . cc($iunreserved . $sub_delims . '@'), '*');

$ihost = ncg(implode('|', array($IP_literal, $IPv4address, $ireg_name)));
$iuserinfo = ncg($pct_encoded . '|' . cc($iunreserved . $sub_delims . ':'), '*');
$iauthority = ncg($iuserinfo . '@', '?') . $ihost . ncg(':' . $port, '?');

$irelative_part = ncg(implode('|', array(
    '\\/\\/' . $iauthority . $ipath_abempty . '',
    '' . $ipath_absolute . '',
    '' . $ipath_noscheme . '',
    '' . $ipath_empty . ''
)));

$irelative_ref = $irelative_part . ncg('\\?' . $iquery, '?') . ncg('\\#' . $ifragment, '?');

$ihier_part = ncg(implode('|', array(
    '\\/\\/' . $iauthority . $ipath_abempty . '',
    '' . $ipath_absolute . '',
    '' . $ipath_rootless . '',
    '' . $ipath_empty . ''
)));

$absolute_IRI = $scheme . ':' . $ihier_part . ncg('\\?' . $iquery, '?');

$IRI = $scheme . ':' . $ihier_part . ncg('\\?' . $iquery, '?') . ncg('\\#' . $ifragment, '?');

$IRI_reference = ncg($IRI . '|' . $irelative_ref);

7 मार्च 2011 को संपादित करें: जिस तरह से PHP उद्धृत तारों में बैकस्लैश को संभालती है, ये डिफ़ॉल्ट रूप से अनुपयोगी हैं। आपको बैकस्लैश को दोहराकर भागने की आवश्यकता होगी, सिवाय इसके कि बैकस्लैश का रेगेक्स में एक विशेष अर्थ है। आप इस तरह से कर सकते हैं:

$escape_backslash = '/(?<!\\)\\(?![\[\]\\\^\$\.\|\*\+\(\)QEnrtaefvdwsDWSbAZzB1-9GX]|x\{[0-9a-f]{1,4}\}|\c[A-Z]|)/';
$absolute_IRI = preg_replace($escape_backslash, '\\\\', $absolute_IRI);
$IRI = preg_replace($escape_backslash, '\\\\', $IRI);
$IRI_reference = preg_replace($escape_backslash, '\\\\', $IRI_reference);

74
यदि आपको लगता है कि यह बुरा है, तो आपको ई-मेल के लिए एक देखना चाहिए: ex-parrot.com/~pdw/Mail-RFC822-Address.html
पीटर डी सेको

12
@ Gumbo, यह कल्पना में और HTTP अनुप्रयोगों के लिए URI कार्यान्वयन में उपयोग किया जाता है। यह (स्पष्ट कारणों के लिए) हतोत्साहित किया गया है, लेकिन पूरी तरह से मान्य है और इसका पूर्वानुमान होना चाहिए। अधिकांश (यदि सभी नहीं!) ब्राउज़र कभी-कभी बाद में उपयोग के लिए URL में HTTP प्रमाणीकरण का अनुवाद करते हैं।
पलकविहीनता

12
@Devin, किस भाषा में एक समारोह में? मैंने इसे PHP में संकलित किया है, लेकिन इसका उपयोग अन्य भाषाओं में किया जा सकता है। क्या मुझे उन सभी भाषाओं में एक फ़ंक्शन लिखना चाहिए? वैकल्पिक रूप से, आपके लिए अपनी पसंद की भाषा में ऐसा करना बहुत सरल होगा।
पलकविहीनता

6
@joshcomley की जगह \ x {ABCD} को \ uABCD करें, अगर आप इसे JS में लिखते हैं
bruha

4
हाँ, http://comएक मान्य URL है। http://localhostअन्य शब्द क्यों नहीं होंगे? आप सही हैं कि uPHP में संशोधक आवश्यक है। मैं स्पष्ट होना चाहता हूं कि जब मैंने इन्हें PHP के साथ उत्पन्न किया था, तो वे PHP- विशिष्ट नहीं थे।
पलकविहीनता

152

मैंने अभी सबसे अधिक उपयोग किए जाने वाले प्रारूपों जैसे URL को पहचानने के लिए एक महान समाधान के लिए एक ब्लॉग पोस्ट लिखा है:

  • www.google.com
  • http://www.google.com
  • mailto:somebody@google.com
  • somebody@google.com
  • www.url-with-querystring.com/?url=has-querystring

उपयोग की गई नियमित अभिव्यक्ति है:

/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/

17
वह भी काम करता है, लेकिन यह पोर्ट नंबर (डीबगिंग में उपयोगी) के लिए समर्थन गायब है। संशोधित किया जाएगा/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(:[0-9]+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/
Jaime Cham

2
यह Regex उन में कोष्ठक के साथ लिंक को संभाल नहीं करता है: जैसे msdn.microsoft.com/en-us/library/ms563775(v=office.14).aspx
RobH

4
Www के बाद डॉट नहीं बचनी चाहिए?
एंथनी

13
एक और मैच मेट मिला: width:210px;औरmargin:3px
Cas Bloem

1
"Example.com" से मेल नहीं खाता ...?
गुस्ताव

80

क्या मंच? यदि .NET का उपयोग कर रहे हैं, तो उपयोग करें System.Uri.TryCreate, रेगेक्स नहीं।

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

static bool IsValidUrl(string urlString)
{
    Uri uri;
    return Uri.TryCreate(urlString, UriKind.Absolute, out uri)
        && (uri.Scheme == Uri.UriSchemeHttp
         || uri.Scheme == Uri.UriSchemeHttps
         || uri.Scheme == Uri.UriSchemeFtp
         || uri.Scheme == Uri.UriSchemeMailto
            /*...*/);
}

// In test fixture...

[Test]
void IsValidUrl_Test()
{
    Assert.True(IsValidUrl("http://www.example.com"));
    Assert.False(IsValidUrl("javascript:alert('xss')"));
    Assert.False(IsValidUrl(""));
    Assert.False(IsValidUrl(null));
}

( टिप के लिए @ योशी को धन्यवाद javascript:)


6
Uri.TryCreate () सही है अगर यह वैध है
डंकन स्मार्ट

112
इस तकनीक का उपयोग करने वाले किसी भी व्यक्ति को एक बड़ी चेतावनी: System.Uri सही ढंग से स्वीकार करता है javascript: alert('blah')। Http / https / ftp प्रोटोकॉल का उपयोग करने के लिए आपको Uri.Scheme पर और अधिक सत्यापन करने की आवश्यकता है , अन्यथा यदि लिंक के रूप में इस तरह के URL को आपके ASP.NET पृष्ठों के HTML में डाला जाता है, तो आपके उपयोगकर्ता XSS हमलों के प्रति संवेदनशील होते हैं
योशी

23
विशेष रूप से, Uri.TryCreate खाली तारों के लिए भी सही है। ऐसा लगता है कि TryCreate बहुत प्रभावी नहीं है ...
स्टीवन एवर्स

1
क्या होगा अगर मुझे ASP.NET MVC ऐप में सर्वर / क्लाइंट-साइड करने के लिए regex की आवश्यकता है? यह क्लाइंट पर मेरी मदद कैसे करेगा?
आंद्रेई रोनेया

4
.Net के लिए, उपयोग करेंUri.IsWellFormedUriString()
mheyman

57

यहाँ RegexBuddy का उपयोग किया गया है।

(\b(https?|ftp|file)://)?[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]

यह इन नीचे ( ** **निशान के अंदर ) से मेल खाता है :

**http://www.regexbuddy.com**  
**http://www.regexbuddy.com/**  
**http://www.regexbuddy.com/index.html**  
**http://www.regexbuddy.com/index.html?source=library**  

आप RegexBuddy को http://www.regexbuddy.com/download.html पर डाउनलोड कर सकते हैं ।


29
गोफर के बारे में क्या? गरीब, भूला हुआ गोफर।
toohool

3
आपका regex किसी भी url से मेल नहीं खाता है जिसमें मैं शामिल हो सकता हूं - जिनमें आप शामिल हैं। मैं आपके रेगेक्स को rubular.com में पेस्ट करता हूं और यह कहता है कि "फॉरवर्ड स्लैश बच जाना चाहिए।" क्या कोई टाइपो है या आप इसे rubular.com पर काम करने के लिए स्पष्ट कर सकते हैं?
पांडावुड

3
@ पांडा यह इसलिए है क्योंकि आपको रूबी के लिए प्रारूपित करने की आवश्यकता है। रूबी का पलायन चरित्र क्या है?
केंग

18
एक जावास्क्रिप्ट RegExp शाब्दिक के रूप में:/\b(https?|ftp|file):\/\/[\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*[\-A-Za-z0-9+&@#\/%=~_|]/
jpillora

1
@toohool, कम से कम गोफर, आर्ची से अधिक समय तक चली। : - \ _ (क्या लोग अभी भी उंगली करते हैं? \)
Synetech

44

पलक झपकने के संबंध में उत्तर पोस्ट में लिखा है कि "यह यूआरआई विनिर्देश के मेरे पढ़ने पर आधारित है।": धन्यवाद पलक, तुम्हारा सही समाधान है जो मैंने मांगा है, क्योंकि यह यूआरआई कल्पना पर आधारित है! शानदार काम। :)

मुझे दो संशोधन करने पड़े। PHP (v5.2.10) को सही ढंग से preg_match () फ़ंक्शन के साथ IP एड्रेस URL से सही तरीके से मिलान करने के लिए सबसे पहले regexp मिलता है।

मुझे पाइप के चारों ओर "आईपी एड्रेस" के ऊपर कोष्ठक के एक और सेट को लाइन में जोड़ना था:

)|((\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])\.){3}(?#

यकीन नहीं है कि क्यों।

मैंने .co.uk और इसी तरह के समर्थन के लिए शीर्ष स्तर के डोमेन की न्यूनतम लंबाई 3 से 2 अक्षरों तक घटा दी है।

अंतिम कोड:

/^(https?|ftp):\/\/(?#                                      protocol
)(([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+(?#         username
)(:([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+)?(?#      password
)@)?(?#                                                     auth requires @
)((([a-z0-9]\.|[a-z0-9][a-z0-9-]*[a-z0-9]\.)*(?#             domain segments AND
)[a-z][a-z0-9-]*[a-z0-9](?#                                 top level domain  OR
)|((\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])\.){3}(?#
    )(\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])(?#             IP address
))(:\d+)?(?#                                                port
))(((\/+([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)*(?# path
)(\?([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)(?#      query string
)?)?)?(?#                                                   path and query string optional
)(#([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)?(?#      fragment
)$/i

इस संशोधित संस्करण को यूआरआई विनिर्देश के खिलाफ जाँच नहीं किया गया था, इसलिए मैं इसका अनुपालन करने की प्रतिज्ञा नहीं कर सकता, यह स्थानीय नेटवर्क वातावरणों पर यूआरएल को संभालने और दो अंकों के टीएलडी के साथ-साथ अन्य प्रकार के वेब यूआरएल और PHP में बेहतर काम करने के लिए बदल दिया गया था। मैं सेटअप का उपयोग करें।

PHP कोड के रूप में :

define('URL_FORMAT', 
'/^(https?):\/\/'.                                         // protocol
'(([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+'.         // username
'(:([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+)?'.      // password
'@)?(?#'.                                                  // auth requires @
')((([a-z0-9]\.|[a-z0-9][a-z0-9-]*[a-z0-9]\.)*'.                      // domain segments AND
'[a-z][a-z0-9-]*[a-z0-9]'.                                 // top level domain  OR
'|((\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])\.){3}'.
'(\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])'.                 // IP address
')(:\d+)?'.                                                // port
')(((\/+([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)*'. // path
'(\?([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)'.      // query string
'?)?)?'.                                                   // path and query string optional
'(#([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)?'.      // fragment
'$/i');

यहाँ PHP में एक परीक्षण कार्यक्रम है जो regex का उपयोग करके विभिन्न प्रकार के URL को मान्य करता है:

<?php

define('URL_FORMAT',
'/^(https?):\/\/'.                                         // protocol
'(([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+'.         // username
'(:([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+)?'.      // password
'@)?(?#'.                                                  // auth requires @
')((([a-z0-9]\.|[a-z0-9][a-z0-9-]*[a-z0-9]\.)*'.                      // domain segments AND
'[a-z][a-z0-9-]*[a-z0-9]'.                                 // top level domain  OR
'|((\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])\.){3}'.
'(\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])'.                 // IP address
')(:\d+)?'.                                                // port
')(((\/+([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)*'. // path
'(\?([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)'.      // query string
'?)?)?'.                                                   // path and query string optional
'(#([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)?'.      // fragment
'$/i');

/**
 * Verify the syntax of the given URL. 
 * 
 * @access public
 * @param $url The URL to verify.
 * @return boolean
 */
function is_valid_url($url) {
  if (str_starts_with(strtolower($url), 'http://localhost')) {
    return true;
  }
  return preg_match(URL_FORMAT, $url);
}


/**
 * String starts with something
 * 
 * This function will return true only if input string starts with
 * niddle
 * 
 * @param string $string Input string
 * @param string $niddle Needle string
 * @return boolean
 */
function str_starts_with($string, $niddle) {
      return substr($string, 0, strlen($niddle)) == $niddle;
}


/**
 * Test a URL for validity and count results.
 * @param url url
 * @param expected expected result (true or false)
 */

$numtests = 0;
$passed = 0;

function test_url($url, $expected) {
  global $numtests, $passed;
  $numtests++;
  $valid = is_valid_url($url);
  echo "URL Valid?: " . ($valid?"yes":"no") . " for URL: $url. Expected: ".($expected?"yes":"no").". ";
  if($valid == $expected) {
    echo "PASS\n"; $passed++;
  } else {
    echo "FAIL\n";
  }
}

echo "URL Tests:\n\n";

test_url("http://localserver/projects/public/assets/javascript/widgets/UserBoxMenu/widget.css", true);
test_url("http://www.google.com", true);
test_url("http://www.google.co.uk/projects/my%20folder/test.php", true);
test_url("https://myserver.localdomain", true);
test_url("http://192.168.1.120/projects/index.php", true);
test_url("http://192.168.1.1/projects/index.php", true);
test_url("http://projectpier-server.localdomain/projects/public/assets/javascript/widgets/UserBoxMenu/widget.css", true);
test_url("https://2.4.168.19/project-pier?c=test&a=b", true);
test_url("https://localhost/a/b/c/test.php?c=controller&arg1=20&arg2=20", true);
test_url("http://user:password@localhost/a/b/c/test.php?c=controller&arg1=20&arg2=20", true);

echo "\n$passed out of $numtests tests passed.\n\n";

?>

Regex के लिए पलकें फिर से धन्यवाद !


1
पलक का जवाब मेरे लिए काम नहीं करता था, लेकिन इस एक ने किया। धन्यवाद!
जोश

यह जावास्क्रिप्ट में काम करता है, लेकिन मुझे जेएस में काम करने के लिए एक पलक प्रदान करने में सक्षम नहीं था , यहां तक ​​कि यूनिकोड वर्णों से बचने के लिए \ u के साथ \ x की जगह लेने के बाद भी
jimmym715

5
थानेदार कुओमोटो की टिप्पणी: "मैंने उपयोगकर्ता 244966 द्वारा रेगेक्स का उपयोग करके समाप्त किया, जो मेरे लिए पठनीय लेकिन पूरी तरह से सही मिश्रण है। हालांकि, रेगेक्स में एक प्रमुख मुद्दा है .... उसका / रेगेक्स डोमेन पर विफल रहता है। एक वर्ण टुकड़े को सम्‍मिलित करें, जैसे कि t.co इस लाइन को इसके ')((([a-z0-9][a-z0-9-]*[a-z0-9]\.)*'.साथ बदलना है ')((([a-z0-9]\.|[a-z0-9][a-z0-9-]*[a-z0-9]\.)*'.। " मैंने इस टिप्पणी के आधार पर संबंधित संपादन किया है।
पीटर ओ।

खूबसूरती से काम करता है! वैसे भी मैंने सिर्फ अपने आप को टिल्ड कैरेक्टर (~) के साथ पाथ के लिए सपोर्ट जोड़ने की इजाजत दी थी, इसे पथ के अनुरूप लाइन में जोड़कर।
सिंह

/^(https?|ftp):(प्रोटोकॉल) आप डेटा, फाइल, svn, dc ++, चुंबक, स्काइप या किसी अन्य द्वारा समर्थित ब्राउज़र को उसी प्लग इन या सर्वर से जुड़े प्रोटोकॉल को क्यों अस्वीकार करते हैं?
एल्पसे एफ।

43

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

सबसे अच्छा पोस्ट किया गया एक छोटा सा लंबा है, लेकिन यह सिर्फ उस चीज के बारे में मेल खाता है जिसे आप इसे फेंक सकते हैं।

जावास्क्रिप्ट संस्करण

/^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,}))\.?)(?::\d{2,5})?(?:[/?#]\S*)?$/i

PHP संस्करण

_^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\x{00a1}-\x{ffff}0-9]-*)*[a-z\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[a-z\x{00a1}-\x{ffff}0-9]-*)*[a-z\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[a-z\x{00a1}-\x{ffff}]{2,}))\.?)(?::\d{2,5})?(?:[/?#]\S*)?$_iuS

1
PHP के उपयोग के साथ preg_match उपयोग के लिए %^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@|\d{1,3}(?:\.\d{1,3}){3}|(?:(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)(?:\.(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)*(?:\.[a-z\x{00a1}-\x{ffff}]{2,6}))(?::\d+)?(?:[^\s]*)?$%iu
टोबी बेर्स्फोर्ड

उस पृष्ठ पर, मैं स्टीफन के समाधान को पसंद करता हूं, क्योंकि यह 502 के बजाय 38 चार्ट है!
वेनरिक्स

इसके अलावा आईपी पते के लिए अनुमति नहीं देता
मैट फ्लेचर

वैध देना (स्लैश स्लैश): //www.2test.com/
stackdave

33

पोस्ट एक यूआरएल के कुछ हिस्सों हो रही है (Regex) एक यूआरएल को पार्स चर्चा उसके विभिन्न घटकों की पहचान। यदि आप यह जांचना चाहते हैं कि क्या URL अच्छी तरह से बना है, तो यह आपकी आवश्यकताओं के लिए पर्याप्त होना चाहिए।

यदि आपको यह जांचने की आवश्यकता है कि क्या यह वास्तव में वैध है, तो आपको अंततः दूसरे छोर पर जो कुछ भी है उसे एक्सेस करने की कोशिश करनी होगी।

सामान्य तौर पर, हालांकि, आप अपने फंक्शन या किसी अन्य लाइब्रेरी द्वारा आपूर्ति किए गए फ़ंक्शन का उपयोग करने से बेहतर होंगे। कई प्लेटफार्मों में URL को पार्स करने वाले फ़ंक्शंस शामिल हैं। उदाहरण के लिए, Python का urlparse मॉड्यूल है, और .NET में आप URL को मान्य करने के साधन के रूप में System.Uri वर्ग के निर्माता का उपयोग कर सकते हैं ।


22

यह रेगेक्स के लिए एक नौकरी नहीं हो सकती है, लेकिन आपकी पसंद की भाषा में मौजूदा उपकरणों के लिए। आप शायद मौजूदा कोड का उपयोग करना चाहते हैं जो पहले से ही लिखा गया है, परीक्षण किया गया है, और डीबग किया गया है।

PHP में, parse_urlफ़ंक्शन का उपयोग करें ।

पर्ल: URIमॉड्यूल

रूबी: URIमॉड्यूल

.NET: 'उरी' क्लास

Regexes एक जादू की छड़ी नहीं है जिसे आप हर समस्या पर लहरते हैं जिसमें तार शामिल होते हैं।


7
आपका अंतिम वाक्य मुझे बहुत कुछ याद दिलाता है कि मैं यंत्र / मैस्लो के हथौड़ा के कानून की याद दिलाता हूं : "यदि आपके पास एक हथौड़ा है, तो सब कुछ नाखून की तरह दिखता है।"
डेविड आरआर

3
हालाँकि, Regexes सादे के शरीर से URL निकालने के लिए सुंदर हैं । यदि आपको संदेह है कि स्ट्रिंग की संपूर्णता एक URL है, तो मैं आपसे 100% सहमत हूं और उल्लेख करता हूं कि जावा का समकक्ष है java.net.URL
ndm13

2
PHP राज्य में parse_url के लिए दस्तावेज़: यह फ़ंक्शन दिए गए URL को मान्य करने के लिए नहीं है, यह केवल इसे ऊपर सूचीबद्ध भागों में तोड़ता है।
डौग एमोस

18

गैर-मान्य URI- संदर्भ पार्सर

संदर्भ उद्देश्यों के लिए, यहां IETF युक्ति: ( TXT) है | HTML ) है। विशेष रूप से, परिशिष्ट बी पार्सिंग एक नियमित अभिव्यक्ति के साथ एक यूआरआइ संदर्भ दर्शाता है कि कैसे एक पार्स करने के लिए वैध regex । यह वर्णित है,

एक गैर-वैध यूआरआई-संदर्भ पार्सर के उदाहरण के लिए जो किसी भी दिए गए स्ट्रिंग को ले जाएगा और यूआरआई घटकों को निकाल देगा।

यहाँ रेगेक्स वे प्रदान करते हैं:

 ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?

जैसा कि किसी और ने कहा है, यह संभवत: यह सबसे अच्छा है कि आप पहले से उपयोग किए जा रहे एक परिवाद / ढांचे को छोड़ दें।


15
पूरी तरह से बेकार। क्या कोई मुझे एक स्ट्रिंग दिखा सकता है जो इस regex से मेल नहीं खाता है? (दोनों # #? #? # "या" <<< >>> "मैच। यूआरआई किस तरह के हैं?)
एलेक्स डी

3
@AlexD मुझे शिकायत मत करो। यह एक URI के लिए आधिकारिक विनिर्देश है। यदि आप इसे पसंद नहीं करते हैं तो इसे IETF के साथ उठाएँ।
हैंक गे

1
@AlexD मुझे लगता है कि उन लोगों को सापेक्ष संदर्भ माना जा सकता है । RFC 3986, खंड 4.2 देखें।
andyg0808

3
@ andyg0808, आप सही हो सकते हैं, लेकिन तथ्य यह है कि यह रेगेक्स सूर्य के नीचे लगभग किसी भी तार से मेल खाता है।
एलेक्स डी

1
यह एक अच्छा जवाब नहीं है क्योंकि यह मान्य नहीं है, सवाल के अनुसार। यह पार्सिंग है। वे दो अलग-अलग कार्य हैं। यदि आप इस रेगेक्स ट्रैश को देते हैं, तो यह इसे पार्स करने की कोशिश करता है। यदि URL मान्य नहीं है, तो पार्सिंग काम करने की गारंटी नहीं है।
इवान कैरोल

15

यह सभी URL से मेल खाएगा

  • http / https के साथ या उसके बिना
  • www के साथ या उसके बिना

... उप-डोमेन और उन नए शीर्ष-स्तरीय डोमेन नाम एक्सटेंशन जैसे कि। संग्रहालय , अकादमी , नींव आदि जिसमें अधिकतम 63 अक्षर हो सकते हैं (न कि सिर्फ। com , नेट , जानकारी आदि)।

(([\w]+:)?//)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,63}(:[\d]+)?(/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?

क्योंकि आज उपलब्ध शीर्ष-स्तरीय डोमेन नाम एक्सटेंशन की अधिकतम लंबाई 13 अक्षर है जैसे कि। अंतरराष्ट्रीय , आप किसी के दुरुपयोग को रोकने के लिए अभिव्यक्ति में संख्या 63 को बदलकर 13 कर सकते हैं।

जावास्क्रिप्ट के रूप में

var urlreg=/(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,63}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?/;

$('textarea').on('input',function(){
  var url = $(this).val();
  $(this).toggleClass('invalid', urlreg.test(url) == false)
});

$('textarea').trigger('input');
textarea{color:green;}
.invalid{color:red;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea>http://www.google.com</textarea>
<textarea>http//www.google.com</textarea>
<textarea>googlecom</textarea>
<textarea>https://www.google.com</textarea>

विकिपीडिया लेख: सभी इंटरनेट शीर्ष-स्तरीय डोमेन की सूची


किसी को भी जावास्क्रिप्ट में उपयोग के लिए इसे बदल सकते हैं?
user1063287

आखिरकार!! क्या कोई इसे उत्तर के रूप में चिह्नित कर सकता है? या पट्टे पर इसे बढ़ाएं। हालांकि मैं बात करता हूं, मुझे नहीं लगता कि यह एकल अक्षर डोमेन से मेल खाता है, अर्थात t.co। इन मामलों को संभालने के लिए आप इसे कैसे समायोजित करेंगे?
अलकासाई

यह http // बिना अनुमति के लगता है:
AwokeKnowing

टेलिफोन नंबरों और ईमेल पतों का मिलान regexr.com/3eosr पर होता है, जो आपके regex को कॉपी करता है, बस सभी स्लैश से बच गया
Can Rau

11

मेरे लिए URL का सबसे अच्छा नियमित अभिव्यक्ति होगा:

"(([\w]+:)?//)?(([\d\w]|%[a-fA-F\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?"

ऐसा लगता है कि इसे स्वीकार किए जाने वाले डोमेन की संख्या w / r / t सीमित होगी?
rektide

2
धन्यवाद! यहाँ बच संस्करण है कि मेरे लिए iOS पर काम किया है:(([\\w]+:)?//)?(([\\d\\w]|%[a-fA-f\\d]{2,2})+(:([\\d\\w]|%[a-fA-f\\d]{2,2})+)?@)?([\\d\\w][-\\d\\w]{0,253}[\\d\\w]\\.)+[\\w]{2,4}(:[\\d]+)?(/([-+_~.\\d\\w]|%[a-fA-f\\d]{2,2})*)*(\\?(&?([-+_~.\\d\\w]|%[a-fA-f\\d]{2,2})=?)*)?(#([-+_~.\\d\\w]|%[a-fA-f\\d]{2,2})*)?
जेम्स कुआंग

यह regex केवल 4 वर्णों तक के प्रत्ययों से मेल खाता है और IP पते (v4 और v6), लोकलहोस्ट, और विदेशी अक्षरों के साथ डोमेन नामों पर विफल रहता है। मैं अपने शामिल किए जाने के आकार पर्वतमाला संपादन और जगह की सिफारिश करेंगे \wके साथ \p{L}कम से कम।
ndm13

ध्यान दें कि यह RegEx " m.sitename.com " जैसे URL को केवल एक अक्षर के उप-डोमेन पर कब्जा नहीं करता है । इसे ठीक करने के लिए, मुझे इसे बदलना ([\d\w][-\d\w]{0,253}[\d\w]\.)+होगा ([\d\w][-\d\w]{0,253}[\d\w]?\.)+(इसके अंत के पास एक प्रश्न चिह्न जोड़ें)
योव फेउरस्टीन

9
        function validateURL(textval) {
            var urlregex = new RegExp(
            "^(http|https|ftp)\://([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&amp;%\$\-]+)*@)*((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|localhost|([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\?\'\\\+&amp;%\$#\=~_\-]+))*$");
            return urlregex.test(textval);
        }

मैच http://site.com/dir/file.php?var=moo |एफ़टीपी: // उपयोगकर्ता: pass@site.com: 21 / फ़ाइल / dir

गैर-मेल साइट site.com | http://site.com/dir//


ध्यान दें कि यह regex मिलान करेगा यदि हमारे पास url में [खाली जगह] है। उदाहरण: http://www.goo gle.comमैच होगा।
Ifch0o1

इस फ़ंक्शन को कॉल करने से पहले parse_url () का उपयोग करें
user1524615

न तो "/" के "और"?, इसके अच्छे अभ्यास से बचना चाहिए और इसे संगत से पार करना चाहिए (जो मुझे पता है (जो इस मामले पर ज्यादा नहीं है :))
स्टीव पी


7

मैं रेगेक्स को खोजने में सक्षम नहीं था, इसलिए मैं अपनी आवश्यकताओं को पूरा करने के लिए एक रेगेक्स को संशोधित कर रहा था, और जाहिर तौर पर यह अब ठीक काम करने लगता है। मेरी आवश्यकताएं थीं:

  • मैच URL w / o प्रोटोकॉल (www.gooogle.com)
  • क्वेरी पैरामीटर और पथ के साथ मिलान URL ( http://subdomain.web-site.com/cgi-bin/perl.cgi?key1=value1&key2=value2e ) के
  • उदाहरण के लिए, जहाँ स्वीकार्य अक्षर नहीं हैं (उदाहरण के लिए "£") URL से मेल न खाएँ: (www.google.com/somthing"/sethingmore)

यहाँ मैं क्या लेकर आया हूँ, किसी भी सुझाव की सराहना की जाती है:

@Test
    public void testWebsiteUrl(){
        String regularExpression = "((http|ftp|https):\\/\\/)?[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&amp;:/~\\+#]*[\\w\\-\\@?^=%&amp;/~\\+#])?";

        assertTrue("www.google.com".matches(regularExpression));
        assertTrue("www.google.co.uk".matches(regularExpression));
        assertTrue("http://www.google.com".matches(regularExpression));
        assertTrue("http://www.google.co.uk".matches(regularExpression));
        assertTrue("https://www.google.com".matches(regularExpression));
        assertTrue("https://www.google.co.uk".matches(regularExpression));
        assertTrue("google.com".matches(regularExpression));
        assertTrue("google.co.uk".matches(regularExpression));
        assertTrue("google.mu".matches(regularExpression));
        assertTrue("mes.intnet.mu".matches(regularExpression));
        assertTrue("cse.uom.ac.mu".matches(regularExpression));

        assertTrue("http://www.google.com/path".matches(regularExpression));
        assertTrue("http://subdomain.web-site.com/cgi-bin/perl.cgi?key1=value1&key2=value2e".matches(regularExpression));
        assertTrue("http://www.google.com/?queryparam=123".matches(regularExpression));
        assertTrue("http://www.google.com/path?queryparam=123".matches(regularExpression));

        assertFalse("www..dr.google".matches(regularExpression));

        assertFalse("www:google.com".matches(regularExpression));

        assertFalse("https://www@.google.com".matches(regularExpression));

        assertFalse("https://www.google.com\"".matches(regularExpression));
        assertFalse("https://www.google.com'".matches(regularExpression));

        assertFalse("http://www.google.com/path'".matches(regularExpression));
        assertFalse("http://subdomain.web-site.com/cgi-bin/perl.cgi?key1=value1&key2=value2e'".matches(regularExpression));
        assertFalse("http://www.google.com/?queryparam=123'".matches(regularExpression));
        assertFalse("http://www.google.com/path?queryparam=12'3".matches(regularExpression));

    }

+1, प्यार जब लोग परीक्षण मामलों को जोड़ते हैं; यह मक्खी पर रीजैक्स को समझने की कोशिश करने के बजाय नेत्रगोलक करना बहुत आसान है।
दाविद ओ

7

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

लेकिन एक रेगेक्स जो वास्तव में सभी संभावित डोमेन से मेल खाता है और आरएफसी के अनुसार किसी भी चीज की अनुमति देता है, वह बहुत लंबा और अपठनीय है, मुझ पर भरोसा करें;;


5

मैं नियमित अभिव्यक्ति का उपयोग करके URI सत्यापन पर चर्चा करने वाले एक गहन लेख पर काम कर रहा हूं। यह RFC3986 पर आधारित है।

नियमित अभिव्यक्ति URI मान्यकरण

यद्यपि लेख अभी तक पूरा नहीं हुआ है, मैं एक PHP फ़ंक्शन के साथ आया हूं जो HTTP और FTP URL को मान्य करने का एक बहुत अच्छा काम करता है। यहाँ वर्तमान संस्करण है:

// function url_valid($url) { Rev:20110423_2000
//
// Return associative array of valid URI components, or FALSE if $url is not
// RFC-3986 compliant. If the passed URL begins with: "www." or "ftp.", then
// "http://" or "ftp://" is prepended and the corrected full-url is stored in
// the return array with a key name "url". This value should be used by the caller.
//
// Return value: FALSE if $url is not valid, otherwise array of URI components:
// e.g.
// Given: "http://www.jmrware.com:80/articles?height=10&width=75#fragone"
// Array(
//    [scheme] => http
//    [authority] => www.jmrware.com:80
//    [userinfo] =>
//    [host] => www.jmrware.com
//    [IP_literal] =>
//    [IPV6address] =>
//    [ls32] =>
//    [IPvFuture] =>
//    [IPv4address] =>
//    [regname] => www.jmrware.com
//    [port] => 80
//    [path_abempty] => /articles
//    [query] => height=10&width=75
//    [fragment] => fragone
//    [url] => http://www.jmrware.com:80/articles?height=10&width=75#fragone
// )
function url_valid($url) {
    if (strpos($url, 'www.') === 0) $url = 'http://'. $url;
    if (strpos($url, 'ftp.') === 0) $url = 'ftp://'. $url;
    if (!preg_match('/# Valid absolute URI having a non-empty, valid DNS host.
        ^
        (?P<scheme>[A-Za-z][A-Za-z0-9+\-.]*):\/\/
        (?P<authority>
          (?:(?P<userinfo>(?:[A-Za-z0-9\-._~!$&\'()*+,;=:]|%[0-9A-Fa-f]{2})*)@)?
          (?P<host>
            (?P<IP_literal>
              \[
              (?:
                (?P<IPV6address>
                  (?:                                                (?:[0-9A-Fa-f]{1,4}:){6}
                  |                                                ::(?:[0-9A-Fa-f]{1,4}:){5}
                  | (?:                          [0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){4}
                  | (?:(?:[0-9A-Fa-f]{1,4}:){0,1}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){3}
                  | (?:(?:[0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){2}
                  | (?:(?:[0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})?::   [0-9A-Fa-f]{1,4}:
                  | (?:(?:[0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})?::
                  )
                  (?P<ls32>[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}
                  | (?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
                       (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
                  )
                |   (?:(?:[0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})?::   [0-9A-Fa-f]{1,4}
                |   (?:(?:[0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})?::
                )
              | (?P<IPvFuture>[Vv][0-9A-Fa-f]+\.[A-Za-z0-9\-._~!$&\'()*+,;=:]+)
              )
              \]
            )
          | (?P<IPv4address>(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
                               (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))
          | (?P<regname>(?:[A-Za-z0-9\-._~!$&\'()*+,;=]|%[0-9A-Fa-f]{2})+)
          )
          (?::(?P<port>[0-9]*))?
        )
        (?P<path_abempty>(?:\/(?:[A-Za-z0-9\-._~!$&\'()*+,;=:@]|%[0-9A-Fa-f]{2})*)*)
        (?:\?(?P<query>       (?:[A-Za-z0-9\-._~!$&\'()*+,;=:@\\/?]|%[0-9A-Fa-f]{2})*))?
        (?:\#(?P<fragment>    (?:[A-Za-z0-9\-._~!$&\'()*+,;=:@\\/?]|%[0-9A-Fa-f]{2})*))?
        $
        /mx', $url, $m)) return FALSE;
    switch ($m['scheme']) {
    case 'https':
    case 'http':
        if ($m['userinfo']) return FALSE; // HTTP scheme does not allow userinfo.
        break;
    case 'ftps':
    case 'ftp':
        break;
    default:
        return FALSE;   // Unrecognized URI scheme. Default to FALSE.
    }
    // Validate host name conforms to DNS "dot-separated-parts".
    if ($m['regname']) { // If host regname specified, check for DNS conformance.
        if (!preg_match('/# HTTP DNS host name.
            ^                      # Anchor to beginning of string.
            (?!.{256})             # Overall host length is less than 256 chars.
            (?:                    # Group dot separated host part alternatives.
              [A-Za-z0-9]\.        # Either a single alphanum followed by dot
            |                      # or... part has more than one char (63 chars max).
              [A-Za-z0-9]          # Part first char is alphanum (no dash).
              [A-Za-z0-9\-]{0,61}  # Internal chars are alphanum plus dash.
              [A-Za-z0-9]          # Part last char is alphanum (no dash).
              \.                   # Each part followed by literal dot.
            )*                     # Zero or more parts before top level domain.
            (?:                    # Explicitly specify top level domains.
              com|edu|gov|int|mil|net|org|biz|
              info|name|pro|aero|coop|museum|
              asia|cat|jobs|mobi|tel|travel|
              [A-Za-z]{2})         # Country codes are exactly two alpha chars.
              \.?                  # Top level domain can end in a dot.
            $                      # Anchor to end of string.
            /ix', $m['host'])) return FALSE;
    }
    $m['url'] = $url;
    for ($i = 0; isset($m[$i]); ++$i) unset($m[$i]);
    return $m; // return TRUE == array of useful named $matches plus the valid $url.
}

यह फ़ंक्शन दो रेगीक्स का उपयोग करता है; वैध जेआरआई (निरपेक्ष मेजबान वाले पूर्ण व्यक्ति) के एक उपसमूह से मेल खाने के लिए, और DNS "डॉट-सेपरेटेड-पार्ट्स" होस्ट नाम को मान्य करने के लिए एक दूसरा। हालाँकि यह फ़ंक्शन वर्तमान में केवल HTTP और FTP योजनाओं को मान्य करता है, लेकिन यह इस तरह संरचित है कि इसे अन्य योजनाओं को संभालने के लिए आसानी से बढ़ाया जा सकता है।


मैं उत्सुक हूं कि आपने IRI RFC3987 के बजाय URI RFC3986 का अनुसरण क्यों चुना।
पलकविहीनता

@ वेलिडेलेसनेस - अच्छा सवाल। मैं वास्तव में आईआरआई के साथ अच्छी तरह से वाकिफ नहीं हूं। आरएफसी को इंगित करने के लिए धन्यवाद। मैं देखता हूँ कि RFC3987 के अनुसार: "... HTTP प्रोटोकॉल [RFC2616] में, अनुरोध URI को URI के रूप में परिभाषित किया गया है, जिसका अर्थ है कि HTTP अनुरोधों में IRI का प्रत्यक्ष उपयोग की अनुमति नहीं है।" इसलिए एक IRI वास्तव में HTTP के माध्यम से भेजे जाने से पहले URI के रूप में एन्कोडेड है। इसलिए फिलहाल, हमेशा यूआरआई सत्यापन की आवश्यकता होगी। हो सकता है कि मैं बाद की तारीख में आईआरआई सत्यापन से निपटूंगा। टिप्पणी के लिए धन्यवाद!
23

@ridgerunner, 2616 का संदर्भ पुराना है। आईआरआई को आईआरआई के रूप में भेजा जाता है, जिसमें आईआरआई और यूआरआई की अनुमति नहीं है। मैं एक "मानव पठनीय" पैटर्न बनाने के प्रयास की सराहना करता हूं (और मैंने खुद पर काम किया है, लेकिन पर्याप्त रूप से परीक्षण करने का अवसर नहीं मिला है) लेकिन 2012 में और 2013 में जाने पर यह गैर-पश्चिमी देशों के पते को सीमित करने के लिए अस्वीकार्य है जबकि गैर- पाश्चात्य वर्ण वास्तव में रास्तों, टुकड़ों और यहां तक ​​कि डोमेन में व्यापक उपयोग में हैं।
पलकविहीनता

@eyelidlessness - मुझे लगता है कि मुझे इस पर करीब से नज़र डालने की ज़रूरत है। सर उठाने के लिए धन्यवाद।
15

@ridgerunner, चीयर्स! और मैं माफी माँगता हूँ अगर मैं असभ्य के रूप में आया, तो मुझे पीने के बाद टिप्पणी नहीं करनी चाहिए! मैं मानव-पठनीय प्रतिमान बनाने के प्रयास की सराहना करता हूं, और आपने मेरा उत्थान किया है।
पलकविहीनता

5

मैंने थोड़ा ग्रूवी संस्करण लिखा है जिसे आप चला सकते हैं

यह निम्नलिखित यूआरएल से मेल खाता है (जो मेरे लिए काफी अच्छा है)

public static void main(args){
        String url = "go to http://www.m.abut.ly/abc its awesome"
        url = url.replaceAll(/https?:\/\/w{0,3}\w*?\.(\w*?\.)?\w{2,3}\S*|www\.(\w*?\.)?\w*?\.\w{2,3}\S*|(\w*?\.)?\w*?\.\w{2,3}[\/\?]\S*/ , { it ->
            "woof${it}woof"
        })
        println url

    }

http://google.com

http://google.com/help.php

http://google.com/help.php?a=5

http://www.google.com

http://www.google.com/help.php

http://www.google.com?a=5

google.com?a=5

google.com/help.php

google.com/help.php?a=5

http://www.m.google.com/help.php?a=5 (और इसके सभी क्रमपरिवर्तन)

www.m.google.com/help.php?a=5 (और इसके सभी क्रमपरिवर्तन)

m.google.com/help.php?a=5 (और इसके सभी क्रमपरिवर्तन)

HTTP या www से शुरू होने वाले किसी भी यूआरएल के लिए महत्वपूर्ण बात यह है कि उन्हें / या शामिल होना चाहिए?

मुझे यकीन है कि इसे थोड़ा और ट्विक किया जा सकता है लेकिन यह इतना छोटा और कॉम्पैक्ट होने के लिए बहुत अच्छा काम करता है ... क्योंकि आप इसे 3 में विभाजित कर सकते हैं:

http: https:? // w {0,3} \ w *?; \ w {2,3} \ _ *

www: www। w * के साथ शुरू होने वाले कुछ भी खोजें? \ w {2,3} \ S *

या ऐसा कुछ भी खोजें जिसमें एक पाठ हो, फिर एक बिंदु और फिर कम से कम 2 अक्षर हों? या /: \ w *?? \ w {2,3} [/ \?] \ S *


1
-URL में इसका कोई समर्थन नहीं है ।
नथादथ

5

मैं इस रेगेक्स का उपयोग करता हूं:

((https?:)?//)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,63}(:[\d]+)?(/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?

दोनों का समर्थन करने के लिए:

http://stackoverflow.com
https://stackoverflow.com

तथा:

//stackoverflow.com

2
मुझे आपका regex अपडेट करना था। तीसरा '?' सभी प्रकार के पाठ को चुनने की अनुमति दे रहा था। इसे हटाने के बाद केवल 'http', 'https', या '//' को चुना गया। मैंने इसे संशोधित किया इसलिए यह सापेक्ष URL पर '/' के लिए काम करता है। और आगे की स्लैश से बच गए। ((https?:)?(\/?\/))(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,63}(:[\d]+)?(/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?
मार्कस

1
कैप्चरिंग समूहों को अपडेट करें ताकि वे अधिक उपयोगी हो सकें: ((?:https?:)?(?:\/?\/))((?:[\d\w]|%[a-fA-f\d]{2,2})+(?::(?:[\d\w]|%[a-fA-f\d]{2,2})+)?@)?((?:[\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,63})(:[\d]+)?(\/(?:[-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(?:&?(?:[-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#(?:[-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?
17

5

यहां एक अच्छा नियम है जो सभी संभावित मामलों को कवर करता है: पोर्ट, परम और आदि

/(https?:\/\/(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9])(:?\d*)\/?([a-z_\/0-9\-#.]*)\??([a-z_\/0-9\-#=&]*)/g

दुर्भाग्यवश, यह URL एक URL एनकोडेड वैल्यू जैसे कि Rayliverified.com?url=https%3A%2F%2Fbing.com
रे ली

4

यह मेरे लिए बहुत अच्छा काम करता है। (https?|ftp)://(www\d?|[a-zA-Z0-9]+)?\.[a-zA-Z0-9-]+(\:|\.)([a-zA-Z0-9.]+|(\d+)?)([/?:].*)?


4

यहां Android स्रोत कोड से रेडी-टू-गो जावा संस्करण है। यह सबसे अच्छा है जो मैंने पाया है।

public static final Matcher WEB  = Pattern.compile(new StringBuilder()                 
.append("((?:(http|https|Http|Https|rtsp|Rtsp):")                      
.append("\\/\\/(?:(?:[a-zA-Z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)")                         
.append("\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,64}(?:\\:(?:[a-zA-Z0-9\\$\\-\\_")                         
.append("\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,25})?\\@)?)?")                         
.append("((?:(?:[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}\\.)+")   // named host                            
.append("(?:")   // plus top level domain                         
.append("(?:aero|arpa|asia|a[cdefgilmnoqrstuwxz])")                         
.append("|(?:biz|b[abdefghijmnorstvwyz])")                         
.append("|(?:cat|com|coop|c[acdfghiklmnoruvxyz])")                         
.append("|d[ejkmoz]")                         
.append("|(?:edu|e[cegrstu])")                         
.append("|f[ijkmor]")                         
.append("|(?:gov|g[abdefghilmnpqrstuwy])")                         
.append("|h[kmnrtu]")                         
.append("|(?:info|int|i[delmnoqrst])")                         
.append("|(?:jobs|j[emop])")                         
.append("|k[eghimnrwyz]")                         
.append("|l[abcikrstuvy]")                         
.append("|(?:mil|mobi|museum|m[acdghklmnopqrstuvwxyz])")                         
.append("|(?:name|net|n[acefgilopruz])")                         
.append("|(?:org|om)")                         
.append("|(?:pro|p[aefghklmnrstwy])")                         
.append("|qa")                         
.append("|r[eouw]")                         
.append("|s[abcdeghijklmnortuvyz]")                         
.append("|(?:tel|travel|t[cdfghjklmnoprtvwz])")                         
.append("|u[agkmsyz]")                         
.append("|v[aceginu]")                         
.append("|w[fs]")                         
.append("|y[etu]")                         
.append("|z[amw]))")                         
.append("|(?:(?:25[0-5]|2[0-4]") // or ip address                                                 
.append("[0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.(?:25[0-5]|2[0-4][0-9]")                             
.append("|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(?:25[0-5]|2[0-4][0-9]|[0-1]")                         
.append("[0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}")                         
.append("|[1-9][0-9]|[0-9])))")                         
.append("(?:\\:\\d{1,5})?)") // plus option port number                             
.append("(\\/(?:(?:[a-zA-Z0-9\\;\\/\\?\\:\\@\\&\\=\\#\\~")  // plus option query params                         
.append("\\-\\.\\+\\!\\*\\'\\(\\)\\,\\_])|(?:\\%[a-fA-F0-9]{2}))*)?")                         
.append("(?:\\b|$)").toString()                 
).matcher("");

यह "न्यू gTLDs" के साथ काम नहीं करता है, en.wikipedia.org/wiki/List_of_Internet_top-level_domains और newgtlds.icann.org/en/program-status/delegated-strings चेक करें । TLD की हार्डकोडिंग सूची खराब प्रथा है ... कुछ सार्वजनिक प्रत्यय सूची उपलब्ध हैं, उनमें TLD के हालिया संस्करण शामिल हैं: publicsuffix.org (फ़ायरफ़ॉक्स, क्रोम, IE में प्रयुक्त)
osgx

यह देखकर मेरा पहला विचार था: ओवरकिल की तरह कोई मार नहीं है। उन्होंने शाब्दिक रूप से सभी ccTLD को लिया और विशेष रूप से उनका मिलान करने के लिए एक regex का निर्माण किया। झूठे सकारात्मक पर काटता है, मुझे लगता है, लेकिन स्थिति को संभालने के लिए एक भयानक तरीका है।
ndm13

4

यहाँ एक regex मैंने बनाया है जो एक URL से विभिन्न भागों को निकालता है:

^((?:https?|ftp):\/\/?)?([^:/\s.]+\.[^:/\s]|localhost)(:\d+)?((?:\/\w+)*\/)?([\w\-.]+[^#?\s]+)?([^#]+)?(#[\w-]+)?$

((?:https?|ftp):\/\/?)?(समूह 1) : प्रोटोकॉल को निकालता है
([^:/\s.]+\.[^:/\s]|localhost)(समूह 2) : होस्टनाम
(:\d+)?(समूह 3) को निकालता है: पोर्ट नंबर
((?:\/\w+)*\/)?([\w\-.]+[^#?\s]+)?(समूह 4 और 5) को निकालता है: पथ भाग
([^#]+)?(समूह 6) को निकालता है: क्वेरी भाग
(#[\w-]+)?(समूह 7) को निकालता है : हैश भाग निकालता है

ऊपर सूचीबद्ध रेगेक्स के हर हिस्से के लिए, आप ?इसे बाध्य करने के लिए समाप्त कर सकते हैं (या इसे नया बनाने के लिए जोड़ सकते हैं)। आप ^शुरुआत में और $रेगेक्स के अंत में भी निकाल सकते हैं, इसलिए इसे पूरे स्ट्रिंग से मेल खाने की आवश्यकता नहीं होगी।

इसे regex101 पर देखें ।

नोट: यह regex 100% सुरक्षित नहीं है और कुछ ऐसे तार स्वीकार कर सकता है जो जरूरी नहीं कि मान्य URL हों लेकिन यह वास्तव में कई मानदंडों को मान्य नहीं करता है। इसका मुख्य लक्ष्य URL के अलग-अलग हिस्सों को मान्य नहीं करना था।


धन्यवाद। इन उत्तरों के लिए समूह दृष्टिकोण सबसे अच्छा है। इस लेख की दिशा में अगले पृष्ठ पर लिंक किए गए अपडेट के लिए उम्मीद है , और "100% सुरक्षित नहीं" का एक संशोधन। अधिकांश पाठकों के लिए 99.9% की तरह एक परिमाण पर्याप्त है। : पी
लॉरी स्टर्न

3

पायथन के लिए, यह वास्तविक URL मान्य रेगेक्स है जिसका उपयोग Django 1.5.1 में किया गया है:

import re
regex = re.compile(
        r'^(?:http|ftp)s?://'  # http:// or https://
        r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|'  # domain...
        r'localhost|'  # localhost...
        r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|'  # ...or ipv4
        r'\[?[A-F0-9]*:[A-F0-9:]+\]?)'  # ...or ipv6
        r'(?::\d+)?'  # optional port
        r'(?:/?|[/?]\S+)$', re.IGNORECASE)

यह दोनों ipv4 और ipv6 पतों के साथ-साथ बंदरगाहों और GET मापदंडों को भी करता है।

यहां कोड में पाया गया , लाइन 44।


3

मैंने URL के लिए निम्न Regex पाया, 500+ URL के साथ सफलतापूर्वक परीक्षण किया :

/\b(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[a-z\x{00a1}-\x{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?\b/gi

मुझे पता है कि यह बदसूरत लग रहा है, लेकिन अच्छी बात यह है कि यह काम करता है। :)

Regex101 पर 581 यादृच्छिक URL के साथ स्पष्टीकरण और डेमो ।

स्रोत: सही URL सत्यापन रेगेक्स की खोज में


3
आपका regex 155'000 चरणों में काम कर रहा है। यहाँ एक और regex है जो आपके द्वारा 19'000 चरणों में प्रदान किए गए सभी 580 URLS का मूल्यांकन कर रहा है regex101 लिंक :/(https?):\/\/([\w-]+(\.[\\w-]+)*\.([a-z]+))(([\w.,@?^=%&amp;:\/~+#()!-]*)([\w@?^=%&amp;\/~+#()!-]))?/gi
जोनाथन Maim

2

मैंने अपने यूआरएल का संस्करण तैयार करने की कोशिश की। मेरी आवश्यकता एक स्ट्रिंग में ऐसे उदाहरणों को पकड़ने की थी जहां संभव यूआरएल cse.uom.ac.mu हो सकता है - यह देखते हुए कि यह http या www से पहले नहीं है

String regularExpression = "((((ht{2}ps?://)?)((w{3}\\.)?))?)[^.&&[a-zA-Z0-9]][a-zA-Z0-9.-]+[^.&&[a-zA-Z0-9]](\\.[a-zA-Z]{2,3})";

assertTrue("www.google.com".matches(regularExpression));
assertTrue("www.google.co.uk".matches(regularExpression));
assertTrue("http://www.google.com".matches(regularExpression));
assertTrue("http://www.google.co.uk".matches(regularExpression));
assertTrue("https://www.google.com".matches(regularExpression));
assertTrue("https://www.google.co.uk".matches(regularExpression));
assertTrue("google.com".matches(regularExpression));
assertTrue("google.co.uk".matches(regularExpression));
assertTrue("google.mu".matches(regularExpression));
assertTrue("mes.intnet.mu".matches(regularExpression));
assertTrue("cse.uom.ac.mu".matches(regularExpression));

//cannot contain 2 '.' after www
assertFalse("www..dr.google".matches(regularExpression));

//cannot contain 2 '.' just before com
assertFalse("www.dr.google..com".matches(regularExpression));

// to test case where url www must be followed with a '.'
assertFalse("www:google.com".matches(regularExpression));

// to test case where url www must be followed with a '.'
//assertFalse("http://wwwe.google.com".matches(regularExpression));

// to test case where www must be preceded with a '.'
assertFalse("https://www@.google.com".matches(regularExpression));

12
आप वास्तव में ht{2}ps?तब उपयोग करते हैंhttps?
Roee Gavirel

2
यह एक ही परिणाम देना चाहिए, लेकिन हाँ आप सही हैं। लेकिन मैं नियमित अभिव्यक्ति के एक प्रयोगात्मक चरण पर था और इसके सभी वाक्यविन्यास को आजमाना चाहता था। इस पर ध्यान दिलाने के लिए धन्यवाद।
आशीष

क्या आप मुझे इस तरह से एक regex प्रदान करने में मदद कर सकते हैं जो क्वेरी पैरामीटर और अन्य पथ से मेल खाता है? जैसे "www.awebsite.com/path?param=value"
Thermz

2

सादे और सरल FILTER_VALIDATE_URL में क्या गलत है?

 $url = "http://www.example.com";

if(!filter_var($url, FILTER_VALIDATE_URL))
  {
  echo "URL is not valid";
  }
else
  {
  echo "URL is valid";
  }

मुझे पता है कि इसका सवाल बिल्कुल नहीं है, लेकिन इसने मेरे लिए काम किया जब मुझे उरल्स को मान्य करने की आवश्यकता थी, तो सोचा कि यह उन लोगों के लिए उपयोगी हो सकता है जो इस पोस्ट के लिए उसी चीज की तलाश में आते हैं


1
यह प्रश्न regexp की तलाश में है, लेकिन आप कुछ फ़िल्टर स्थिरांक का उपयोग करने का सुझाव देते हैं। क्या आप जानते हैं कि यह आंतरिक रूप से लिंक की खोज कैसे करता है?
कुित्सि

सवाल यह है: "एक स्ट्रिंग एक वैध URL है या नहीं यह जांचने के लिए सबसे अच्छी नियमित अभिव्यक्ति क्या है?" कभी-कभी समस्या एक स्ट्रिंग की जांच करने के लिए नहीं होती है जिसे URL माना जाता है, कभी-कभी आपके पास एक पाठ होता है और आपको उस पाठ में सभी URL पढ़ने की आवश्यकता होती है, और REGEX का उपयोग करना एकमात्र तरीका है। इसके अलावा ओपी किसी विशेष भाषा को निर्दिष्ट किए बिना एक समाधान के लिए पूछता है, आपका समाधान केवल एक विशिष्ट प्लेटफॉर्म में लागू किया जा सकता है।
थर्मज


2

यह मेरे लिए काम कर रहे एक का उपयोग करें

function validUrl(Url) {
    var myRegExp  =/^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/i;

    if (!RegExp.test(Url.value)) {
        $("#urlErrorLbl").removeClass('highlightNew');
        return false;
    } 

    $("#urlErrorLbl").addClass('highlightNew'); 
    return true; 
}

2

यहाँ सुविधा के लिए URL के लिए वन-लाइनर regexp है, जो लोकलहोस्ट से भी मेल खाएगा जहाँ आप पोर्ट के .comसमान या उससे अधिक होने की संभावना रखते हैं ।

(http(s)?:\/\/.)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}(\.[a-z]{2,6}|:[0-9]{3,4})\b([-a-zA-Z0-9@:%_\+.~#?&\/\/=]*)

2

आप यह निर्दिष्ट नहीं करते कि आप किस भाषा का उपयोग कर रहे हैं। यदि PHP है, तो इसके लिए एक मूल कार्य है:

$url = 'http://www.yoururl.co.uk/sub1/sub2/?param=1&param2/';

if ( ! filter_var( $url, FILTER_VALIDATE_URL ) ) {
    // Wrong
}
else {
    // Valid
}

फ़िल्टर किए गए डेटा को लौटाता है, या फ़िल्टर विफल होने पर FALSE करता है।

इसे यहाँ देखें >>

आशा है ये मदद करेगा।

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