एक नियमित अभिव्यक्ति क्या है जो एक उप डोमेन के बिना एक वैध डोमेन नाम से मेल खाएगी?


123

मुझे एक डोमेन नाम मान्य करने की आवश्यकता है:

Google.com

stackoverflow.com

तो अपने कच्चे रूप में एक डोमेन - www की तरह एक उपडोमेन भी नहीं।

  1. अक्षर केवल az होना चाहिए | AZ | 0-9 और अवधि (?) और डैश (-)
  2. डोमेन नाम का हिस्सा डैश (-) (जैसे -google-.com) के साथ शुरू या समाप्त नहीं होना चाहिए
  3. डोमेन नाम भाग 1 और 63 वर्णों के बीच होना चाहिए
  4. विस्तार (TLD) अभी के लिए # 1 नियमों के तहत कुछ भी हो सकता है, मैं उन्हें बाद में एक सूची के खिलाफ मान्य कर सकता हूं, हालांकि यह 1 या अधिक वर्ण होना चाहिए

संपादित करें: TLD स्पष्ट रूप से 2-6 वर्ण है क्योंकि यह खड़ा है

नहीं। 4 संशोधित: TLD को वास्तव में "उपडोमेन" लेबल किया जाना चाहिए क्योंकि इसमें .co.uk जैसी चीजें शामिल होनी चाहिए - मैं केवल एक ही सत्यापन संभव होगा (एक सूची के खिलाफ जांच के अलावा) 'पहले बिंदु के बाद एक या एक होना चाहिए' नियम # 1 के तहत अधिक वर्ण

बहुत बहुत धन्यवाद, मुझे विश्वास है कि मैंने कोशिश की थी!


1
हो सकता है मददगार न हों। जब यह google.co.uk, और कुछ जापानी डोमेन की बात आती है, तो मुझे यकीन है कि इसके लिए regex का उपयोग करने से पहले आपको दो बार सोचना होगा। मेरा व्यक्तिगत विचार यह है कि regex एक डोमेन को वास्तविक जीवन के डोमेन को मान्य करने के लिए पर्याप्त नहीं है। FYI करें, यहाँ टॉरेट्स और कंट्री कोड सेकंड लेवल डोमेन लिस्ट की लगभग पूरी सूची है: static.ayesh.me/misc/SO/tlds.txt
K

1
होस्टनाम सत्यापन के बारे में संबंधित प्रश्न के लिए मेरा उत्तर देखें ।
एसएएम

2
अक्सर भूल गए: पूर्ण योग्य डोमेन नामों के लिए आपको tld के बाद की अवधि से मेल खाना चाहिए।
schmijos

1
4 साल हो गए हैं, अब गिनती 89,000 तक है
mydoglixu

1
इनमें से कुछ उत्तर बहुत अच्छे हैं, लेकिन इस अन्य प्रश्न पर एक और अच्छा उत्तर है जो देखने लायक है।
craftworkgames

जवाबों:


49

अपनी विशिष्ट आवश्यकताओं को देखते हुए, यह दिखने में (टिप्पणियों को देखने) की तुलना में थोड़ा सीधा है , बहुत सुंदर है :

/^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}$/

लेकिन ध्यान दें कि यह बहुत सारे मान्य डोमेन को अस्वीकार कर देगा।


अच्छा लगता है कि यह काम कर रहा है। आप किस प्रकार के डोमेन को मान्यता नहीं देंगे?
डोमिनिक

12
@infensus - जबकि इस रेगेक्स को आपके चश्मे को सही बताया गया है, आपके चश्मे गलत हैं। g.coएक मान्य डोमेन नाम है लेकिन gकेवल एक वर्ण है।
sch

3
मुझे लगता है कि सभी मामलों से मेल खाना चाहिए: ^ ([a-z0-9]) (([[z-z0-9 -] {1,61}]? [A-z0-9] {1})? (\) [एक-Z0-9] (([एक-Z0-9 -]? {1,61}) [एक-Z0-9] {1})?।) (\ [a-zA-Z] {2 , 4}) + $
ट्रांसिलवैलड

1
x.com यहां से नहीं गुजरेगा
नील मैकग्यूगन

4
@ नील: आप सही कह रहे हैं। मूल प्रश्न 3-63 वर्णों के लिए पूछा गया है (देखें संपादन 3)। इसे एक-वर्ण डोमेन का समर्थन करने के लिए काफी आसानी से बदला जा सकता है /^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.[a-zA-Z]{2,}$/:। लेकिन यह अभी भी टन के वैध सामान को खारिज कर देता है ...
कैमरन

85

मुझे पता है कि यह एक पुरानी पोस्ट का एक सा है, लेकिन यहां सभी नियमित अभिव्यक्तियाँ एक बहुत महत्वपूर्ण घटक को याद कर रही हैं: IDNI नामों का समर्थन।

IDN डोमेन नाम xn-- से शुरू होते हैं। वे डोमेन नाम में विस्तारित UTF-8 वर्ण सक्षम करते हैं। उदाहरण के लिए, क्या आप जानते हैं कि "com .com" एक मान्य डोमेन नाम है? हाँ, "लव हार्ट डॉट कॉम"! डोमेन नाम को मान्य करने के लिए, आपको http://xn--c6h.com/ सत्यापन पास करने की आवश्यकता है ।

ध्यान दें, इस रेगेक्स का उपयोग करने के लिए, आपको डोमेन को लोअर केस में बदलने की आवश्यकता होगी, और यह सुनिश्चित करने के लिए कि आप ACE को डोमेन नामों को एनकोड करने के लिए एक IDN लाइब्रेरी का भी उपयोग करें (जिसे "ASCII कम्पेटिबल एन्कोडिंग" भी कहा जाता है)। एक अच्छी लाइब्रेरी GNU-Libidn है।

idn (1) अंतर्राष्ट्रीय डोमेन नाम पुस्तकालय के लिए कमांड लाइन इंटरफ़ेस है। निम्न उदाहरण UTF-8 में होस्ट नाम को ACE एन्कोडिंग में परिवर्तित करता है। परिणामी URL https: //nic.xn--flw351e/ तब ACE- एन्कोडेड के बराबर https: // nic। Of // / के रूप में उपयोग किया जा सकता है ।

  $ idn --quiet -a nic.谷歌
  nic.xn--flw351e

इस जादू की नियमित अभिव्यक्ति को अधिकांश डोमेन को कवर करना चाहिए (हालांकि, मुझे यकीन है कि कई वैध किनारे मामले हैं जो मुझे याद हैं)

^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,1}\.(xn--)?([a-z0-9\-]{1,61}|[a-z0-9-]{1,30}\.[a-z]{2,})$

एक डोमेन सत्यापन रेगेक्स चुनते समय, आपको यह देखना चाहिए कि क्या डोमेन निम्नलिखित से मेल खाता है:

  1. xn--stackoverflow.com
  2. stackoverflow.xn - कॉम
  3. stackoverflow.co.uk

यदि ये तीन डोमेन पास नहीं होते हैं, तो आपकी नियमित अभिव्यक्ति वैध डोमेन की अनुमति नहीं दे सकती है!

की जाँच करें Oracle की अंतर्राष्ट्रीय भाषा पर्यावरण गाइड से अंतर्राष्ट्रीय डोमेन नाम समर्थन पृष्ठ अधिक जानकारी के लिए।

यहाँ रेगेक्स आज़माने के लिए स्वतंत्र महसूस करें: http://www.regexr.com/3abjr

आईसीएएनएन उन प्रतिनिधियों की सूची रखता है, जिनका उपयोग आईडीएन डोमेन के कुछ उदाहरणों को देखने के लिए किया जा सकता है।


संपादित करें:

 ^(((?!-))(xn--|_{1,1})?[a-z0-9-]{0,61}[a-z0-9]{1,1}\.)*(xn--)?([a-z0-9][a-z0-9\-]{0,60}|[a-z0-9-]{1,30}\.[a-z]{2,})$

यह नियमित अभिव्यक्ति एक होस्टनाम के अंत में '-' वाले डोमेन को वैध होने के रूप में चिह्नित करेगी। इसके अतिरिक्त, यह असीमित उप-डोमेन की अनुमति देता है।


1
ध्यान दें कि यह केवल अधिकतम एक उपडोमेन का समर्थन करेगा, इससे अधिक कुछ भी गलत परिणाम देगा। यह ऐसा कुछ नहीं है जिसे आप आंतरिक साइटों के लिए उपयोग करने तक चलाने के लिए /^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,}\.?((xn--)?([a-z0-9\-.]{1,61}|[a-z0-9-]{1,30})\.?[a-z]{2,})$/i
परिवादित हैं

1
लेकिन अकेला tld काम नहीं कर रहा है :( उदाहरण के लिए to.( ) सामग्री के साथ मान्य url है।
iiic

@ यिक, हाँ, लेकिन to.पूरी तरह से योग्य डोमेन नाम नहीं है। यदि आप शीर्ष स्तर के डोमेन को अनुमति देना चाहते हैं, तो आपको कुछ का उपयोग करना चाहिए ^(((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,1}\.)?(x--)?([a-z0-9\-]{1,61}|[a-z0-9-]{1,30}\.[a-z]{2,})\.?$, लेकिन चेतावनी दी जाए, आप लोगों को डोमेन testया जैसे डोमेन में डाल देंगे na!
टिम ग्रैनेवेल्ड सेप

यह अमान्य invali.dडोमेन नाम के रूप में स्वीकार करता है जबकि invali.d.co.ukअमान्य है।
पावेल क्राकोविआक

1
यह ध्यान दिया जाना चाहिए कि xn--stackoverflow.comएक वैध नाम नहीं है क्योंकि 'स्टैकओवरफ़्लो' को पुण्यकोड से परिवर्तित नहीं किया जा सकता है। हालांकि, यह परे है कि रेगेक्स क्या कर सकता है। एक सामान्य टिप्पणी के रूप में, xn--[a-z0-9]+लेबल केवल IDN होगा , जबकि xn--[a-z0-9]+\-[a-z0-9]+ASCII- और गैर-ASCII वर्णों का मिश्रण होगा
मार्कस

50

मेरा RegEx अगला है:

^[a-zA-Z0-9][a-zA-Z0-9-_]{0,61}[a-zA-Z0-9]{0,1}\.([a-zA-Z]{1,6}|[a-zA-Z0-9-]{1,30}\.[a-zA-Z]{2,3})$

इसके लिए ठीक है i.oh1.me और के लिए wow.british-library.uk

युपीडी

यहाँ अद्यतन नियम है

^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$

नियमित अभिव्यक्ति दृश्य

https://www.debuggex.com/r/y4Xe_hDVO11bv1DV

अब इसकी जांच -या _शुरू में या डोमेन लेबल के अंत।


9
बहुत अच्छा लग रहा है, लेकिन {2,6}नए TLD के लिए मापदंड को अपडेट करना होगा। शायद {2,}
jwatts1980

@ jwatts1980 ऐसे जोनों का एक उदाहरण है? या आप भविष्य के संभावित क्षेत्रों के लिए मतलब है?
पका

1
यहां एक लेख में संबंधित संसाधनों के उदाहरणों और लिंक के साथ आगामी परिवर्तनों पर चर्चा की गई है: zdnet.com/…
jwatts1980

1
क्यों ([ए-जेडए-जेड] {1} [ए-जेडए-जेड] {1}) और नहीं ([ए-जेडए-जेड] {2})?
एंटोन

3
दो विकल्पों के साथ अंतिम भाग भी गलत है: इसमें ccTLDs (दो अक्षर) मौजूद हैं जो IDNA सबलैबल्स को स्वीकार करते हैं। वहाँ भी मौजूद है अब TLDs लेबल पहले से ही IDNA लेबल का उपयोग कर रहे हैं। आपको अंतिम लेबल पर विशेष मामला नहीं करना चाहिए जो दूसरों से अलग नहीं है (और अब कई एक्सटेंशन हैं जो कि वैरिएबल लंबाई के साथ जोड़े गए हैं, सबडोमेनस में अन्य सभी लेबल की तरह jsut। ध्यान दें कि IDNA लेबल भी पुनर्नवीनीकरण दिखाई दे सकते हैं (जिस स्थिति में यह होगा) - - "लेबल में एक खंड, एकमात्र मामला जहां" - "लेबल में अनुमति है .. अंत में सभी लेबल में अंडरस्कोर अमान्य है।
verdy_p

24

मेरी शर्त:

^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$

व्याख्या की:

डोमेन नाम सेगमेंट से बनाया गया है। यहाँ एक खंड (अंतिम को छोड़कर) है:

[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?

इसमें 1-63 अक्षर हो सकते हैं, '-' के साथ शुरू या समाप्त नहीं होता है।

अब अपेंड करें '।' इसके लिए और कम से कम एक बार दोहराएं:

(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+

फिर अंतिम खंड संलग्न करें, जो 2-63 वर्ण लंबा है:

[a-z0-9][a-z0-9-]{0,61}[a-z0-9]

इसका परीक्षण यहां करें: http://regexr.com/3au3g


@ गणेशबाबू आपको सटीक मैचों से क्या मतलब है?
यारोस्लाव स्टवानिच

1
अन्य सभी उत्तरों ने मेरे लिए काम नहीं किया, लेकिन यह किया।
डैनी कूलोम्बे

मुझे इसी तरह की आवश्यकता थी जहां मैं अर्धविराम और अल्पविराम से बचना चाहता हूं, मैंने बहुत कोशिश की, लेकिन नीचे कोई सफलता नहीं है Regex मैं const regexDomain = / ^ का उपयोग कर रहा हूं? (?: [A-Za-z0 -9] ?:? [एक-zA-Z0-9 -] {0,61} [ए-zA-Z0-9]) \) + [एक-zA-Z0-9] [ए-zA-Z0-9 -]?। { 0,61} [ए-zA-Z0-9] / जी; वैसे यह मान्य है अगर मैं उपयोग करता हूं, और; बीच में लेकिन वलिअडेट करने के लिए अंत में विफल रहता है।
हैरी

मुझे कई डोमेन मिले जो मान्य होने चाहिए लेकिन आपके regex के साथ अमान्य हैं। उदाहरण редбулл.москва के लिए मान्य डोमेन या है भी редбулл.рф और红色的公牛中国।
pubkey

1
@pubkey, आप करने के लिए उन डोमेन नाम बदलने की आवश्यकता पनीकोड । Редбулл.москва का वास्तविक नाम xn - 90afc0aazy.xn - 80adxhks है और मेरा regex इससे मेल खाता है।
यारोस्लाव स्टवानिच

13

बस एक मामूली सुधार - अंतिम भाग 6. तक होना चाहिए, इसलिए,

^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}$

सबसे लंबा TLD है museum(6 वर्ण) - http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains


3
नोट: यह वैध (अभी तक दुर्लभ) डोमेन नाम www.my---domain.com
क्रिस बियर

17
इसे नए टीएलडी जैसे.photography
सैम फिगेरो

2
@SamFigueroa आपको बस इसकी लंबाई को संशोधित करना होगा
स्टील ब्रेन

3
TLD के लिए एक चेक नहीं होना चाहिए, यह उप डोमेन से अलग नहीं है। और वर्तमान में availableटॉग्स पर रेगेक्स को आधार बनाकर भविष्य के प्रमाण नहीं हैं।
लूका फॉरेक्स-लैक्रोसिक्स

1
सुझाव अंतिम रूप से {2,63}देखें: stackoverflow.com/questions/9238640/…
एरिक डॉब्स

13

मेरे लिए काम नहीं करने पर स्वीकृत जवाब, यह कोशिश करें:

^ ((-?!) [एक-zA-Z0-9 -] {1,63} (<-?!)। \) + [ए-Za-z] {2,6} $

सत्यापन के लिए इस यूनिट टेस्ट के मामलों पर जाएं ।


4
नए लंबे समय तक TLD नामों के लिए कोई समर्थन नहीं है जैसे .audio, .photography, और इनमें से अधिकांश ... data.iana.org/TLD/tlds-alpha-by-domain.txt
mrbinky3000

@ mrbinky3000 बस {2,6}कुछ और करने के लिए पिछले बदलें और यह काम करेंगे। मेरा:^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
मैगोड

@ अपने रेग्क्स में आखिरी प्रश्न चिह्न के साथ कुछ शून्य चौड़ाई का कचरा होता है, इसलिए इसे कॉपी करने वाला कोई भी व्यक्ति अप्रिय रूप से आश्चर्यचकित हो जाएगा
MightyPork

1
@MightyPork तुम सही हो! क्षमा करें यहाँ (उम्मीद है) स्वच्छ संस्करण:^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
Mygod

बहुत अच्छा। जावास्क्रिप्ट में एबस, लुकअप भाव मान्य नहीं हैं। : /
फील्हो

13

यह उत्तर डोमेन नाम (सेवा आरआर सहित) के लिए है, न कि होस्ट नाम (ईमेल होस्टनाम की तरह)।

^(?=.{1,253}\.?$)(?:(?!-|[^.]+_)[A-Za-z0-9-_]{1,63}(?<!-)(?:\.|$)){2,}$

यह मूल रूप से मिकोन्ग का उत्तर है और इसके अतिरिक्त:

  • लम्बाई उपसर्ग और नल मूल सहित 255 ओकटेट की अधिकतम लंबाई।
  • अनुगमन की अनुमति दें '।' स्पष्ट dns रूट के लिए।
  • सेवा डोमेन RRs के लिए अग्रणी '_' की अनुमति दें, (बग: _ लेबल के लिए 15 char अधिकतम लागू नहीं करता है, और न ही इसे सेवा RRs के ऊपर कम से कम एक डोमेन की आवश्यकता है)
  • सभी संभव TLDs से मेल खाता है।
  • उपडोमेन लेबल पर कब्जा नहीं करता है।

भागों द्वारा

लुकहेड, वैकल्पिक ट्रेलिंग शाब्दिक के साथ ^ $ 253 वर्णों के बीच अधिकतम लंबाई को सीमित करता है। '

(?=.{1,253}\.?$)

लुकहेड, अगला चरित्र '-' नहीं है और कोई भी '_' अगले 'से पहले किसी भी वर्ण का अनुसरण नहीं करता है।' यह कहना है, लागू करें कि एक लेबल का पहला वर्ण '-' नहीं है और केवल पहला वर्ण '_' हो सकता है।

(?!-|[^.]+_)

प्रति लेबल अनुमत वर्णों में से 1 और 63 के बीच।

[A-Za-z0-9-_]{1,63}

लुकबाइंड, पिछला चरित्र '-' नहीं। यह कहना है, लागू करें कि एक लेबल का अंतिम वर्ण '-' नहीं है।

(?<!-)

फोर्स ए। ' हर लेबल के अंत में अंतिम को छोड़कर, जहां यह वैकल्पिक है।

(?:\.|$)

ज्यादातर ऊपर से संयुक्त है, इसके लिए कम से कम दो डोमेन स्तर की आवश्यकता होती है, जो कि बहुत सही नहीं है, लेकिन आमतौर पर एक उचित धारणा है। यदि आप TLD या अयोग्य रिश्तेदार उप-डोमेन के माध्यम से अनुमति देना चाहते हैं, तो (2,} से + में बदलें।

(?:(?!-|[^.]+_)[A-Za-z0-9-_]{1,63}(?<!-)(?:\.|$)){2,}

इस अभिव्यक्ति के लिए यूनिट परीक्षण


1
धन्यवाद! यह यहां का सर्वश्रेष्ठ रेगेक्स है। आपकी संपूर्ण व्याख्या और इकाई परीक्षण एक बोनस है।
नौडस्टर

"आरआर" का क्या अर्थ है?
व्हीलर

संसाधन रिकॉर्ड। आमतौर पर एक पाठ या सूचनात्मक क्षेत्र जो आपको बताता है कि किसी सेवा के साथ बातचीत कैसे करें।
एंड्रयू डॉमासेक

यह रेगेक्स सही नहीं है। उदाहरण के लिए डोमेन रिडबल। valid वैध है लेकिन रेगेक्स मेल नहीं खाएगा।
जवानी

पहले पंचकोश में बदलें, फिर मिलान करें। प्री-पाइनकोड संस्करण पर लंबाई सीमाएं वास्तव में लागू करना कठिन है।
एंड्रयू डॉमासेक

8

अन्य उत्तर में डोमेन नाम सत्यापन समाधान में सही दिशा इंगित करने के लिए धन्यवाद। डोमेन नाम विभिन्न तरीकों से मान्य किए जा सकते हैं।

यदि आपको IDN डोमेन को मानव पठनीय रूप, regex में मान्य करना है\p{L} मदद करेगा। यह किसी भी भाषा में किसी भी चरित्र से मेल खाने की अनुमति देता है।

ध्यान दें कि पिछले भाग में हाइफ़न हो सकते हैं भी ! जैसा कि पंचकोशों ने कूटबद्ध किया था कि चाइन के नाम में tld में यूनिकोड वर्ण हो सकते हैं।

मैं समाधान के लिए आया हूँ जो उदाहरण के लिए मेल खाएगा:

  • Google.com
  • masełkowski.pl
  • maselkowski.pl
  • m.maselkowski.pl
  • www.masełkowski.pl.com
  • xn--masekowski-d0b.pl
  • 中国 互联 网络 信息 中心। 中国
  • xn - fiqa61au8b7zsevnm8ak20mc4a87e.xn - fiqs8s

रेगेक्स है:

^[0-9\p{L}][0-9\p{L}-\.]{1,61}[0-9\p{L}]\.[0-9\p{L}][\p{L}-]*[0-9\p{L}]+$

यहां जांचें और ट्यून करें

ध्यान दें: यह regexp काफी अनुमत है, जैसा कि वर्तमान डोमेन नामों से वर्ण सेट की अनुमति है।

अद्यतन : और भी अधिक सरल, a-aA-Z\p{L}बस के रूप में ही है\p{L}

NOTE2: एकमात्र समस्या यह है कि यह डबल डॉट्स वाले डोमेन से मेल खाएगा ..., जैसे masełk..owski.pl। अगर किसी को पता है कि इसे कैसे ठीक करना है तो कृपया सुधार करें।


हम सिर्फ [:alpha:]और केवल उपयोग कर सकते [:digit]हैं \p{L}। यह बढ़िया काम करता है।
पुचू

आप किसी IDN को इस तरह से मान्य नहीं कर सकते, बिना पहले इसे पाइकोडोड में परिवर्तित किए। उदाहरण के लिए, आपके expr के साथ, 中国互联网络信息中心中国互联网络信息中心中国互联网络信.中国मान्य के रूप में जाँच करता है, लेकिन IDN रूपांतरण के बाद, यह प्रति लेबल बहुत अधिक बाइट्स है। \ p {L} प्रतीकों से मेल खाता है, न कि पंचकोश बाइट्स (जो प्रतीक से प्रतीक से भिन्न होता है), इसलिए जब इसके रूपांतरण के बाद के आकार को सीमित करने की कोशिश की जाती है, तो दोहराने की संख्या अप्राप्य होती है।
एंड्रयू डॉमासेक

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

7
^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,7}$

[डोमेन - लोअर केस लेटर्स और 0-9 ओनली] [हाइफ़न हो सकता है] + [टीएलडी - लोअर केस केवल, २ और long अक्षरों का होना चाहिए लंबा]
http://rubular.com/ नियमित एक्सप्रेशन के परीक्षण के लिए शानदार है!
संपादित करें: डैन कैडिगन के रूप में '.rentals' के लिए अधिकतम 7 वर्णों का TLD अपडेट किया गया।


1
TLDs को सीमित क्यों करें? अब .photographyअमान्य होगा। बस इसे असीमित आकर्षण या ऐसा कुछ करें।
एड्रियन

5

टिप्पणी करने के लिए अभी तक पर्याप्त प्रतिनिधि नहीं है। पाका के समाधान के जवाब में, मैंने पाया कि मुझे तीन वस्तुओं को समायोजित करने की आवश्यकता है:

  • पानी का छींटा एक सीमा के रूप में व्याख्या किए जाने के कारण पानी और पानी के नीचे चला गया था (जैसा कि "0-9" में)
  • कई उप डोमेन के साथ डोमेन नाम के लिए एक पूर्ण विराम जोड़ा गया
  • TLD के लिए संभावित लंबाई को 13 तक बढ़ाया गया

इससे पहले:

^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$

उपरांत:

^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][-_\.a-zA-Z0-9]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,13}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$

3

नए gTLDs के लिए

/^((?!-)[\p{L}\p{N}-]+(?<!-)\.)+[\p{L}\p{N}]{2,}$/iu

2
कृपया हमें कुछ और विवरण दें जो आप उत्तर देते हैं कि आप दूसरों की तुलना में बेहतर हैं? आप और अधिक क्या मेल खाते हैं? कृपया जानकारी जोड़ने के लिए अपनी पोस्ट को सीधे संपादित करें।
स्वेन आर।

जैसे मैंने लिखा: नया जी.टी.एल.डी. यूनिकोड चार्ट के साथ डोमेन और यूनिकोड टीएलडी भी।
बेन केइल

1
@ बेनकेइल: इस भाग के बारे में क्या है: (? <! -)
जोर

@ जोर्ज निगेटिव लुक है पीछे। इसे बाहर की जाँच करें shortcutfoo.com/app/dojos/regex/cheatsheet
मुहम्मद फैजान

3

जैसा कि पहले ही बताया गया है कि उप डोमेन को व्यावहारिक अर्थों में बताना स्पष्ट नहीं है (जैसे .co.ukडोमेन)। हम इस रेगेक्स का उपयोग उन डोमेन को मान्य करने के लिए करते हैं जो जंगली में होते हैं। यह मेरे द्वारा ज्ञात सभी व्यावहारिक उपयोग के मामलों को कवर करता है। नए लोगों का स्वागत है। हमारे दिशानिर्देशों के अनुसार यह गैर-कैप्चरिंग समूहों और लालची मिलान से बचता है।

^(?!.*?_.*?)(?!(?:[\d\w]+?\.)?\-[\w\d\.\-]*?)(?![\w\d]+?\-\.(?:[\d\w\.\-]+?))(?=[\w\d])(?=[\w\d\.\-]*?\.+[\w\d\.\-]*?)(?![\w\d\.\-]{254})(?!(?:\.?[\w\d\-\.]*?[\w\d\-]{64,}\.)+?)[\w\d\.\-]+?(?<![\w\d\-\.]*?\.[\d]+?)(?<=[\w\d\-]{2,})(?<![\w\d\-]{25})$

प्रमाण, स्पष्टीकरण और उदाहरण: https://regex101.com/r/FLA9Bv/9 ( नोट: वर्तमान में केवल क्रोम में काम करता है क्योंकि रेगेक्स लुकबाइंड का उपयोग करता है जो केवल ECMA2018 में समर्थित हैं )

डोमेन को मान्य करते समय चुनने के लिए दो दृष्टिकोण हैं।

FQDN द्वारा पुस्तकों का मिलान (सैद्धांतिक परिभाषा, व्यवहार में शायद ही कभी सामना हुआ):

व्यावहारिक / रूढ़िवादी FQDN मिलान (व्यावहारिक परिभाषा, व्यवहार में अपेक्षित और समर्थित):

  • निम्नलिखित अपवादों / परिवर्धन से मेल खाने वाली पुस्तकें
  • मान्य वर्ण: [a-zA-Z0-9.-]
  • लेबल हाइफ़न के साथ शुरू या समाप्त नहीं हो सकते ( आरएफसी -952 और आरएफसी -1123 / 2.1 के अनुसार )
  • TLD न्यूनतम लंबाई 2 वर्ण है, वर्तमान में मौजूद रिकॉर्ड के अनुसार अधिकतम लंबाई 24 वर्ण है
  • अनुगामी डॉट से मेल नहीं खाते

2
^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]+(\.[a-zA-Z]+)$

5
-1 के अलावा {2,4} के लिए। एकल वर्ण TLD का होना संभव है (हालाँकि, वर्तमान में कोई भी मूल नहीं है)। मोबाइल के बारे में क्या? .associates? दोनों वैध TLD हैं, और इस regex द्वारा अस्वीकार कर दिया जाएगा। data.iana.org/TLD/tlds-alpha-by-domain.txt
टिम

2

यहाँ उदाहरण के साथ पूरा कोड है:

<?php
function is_domain($url)
{
    $parse = parse_url($url);
    if (isset($parse['host'])) {
        $domain = $parse['host'];
    } else {
        $domain = $url;
    }

    return preg_match('/^(?!\-)(?:[a-zA-Z\d\-]{0,62}[a-zA-Z\d]\.){1,126}(?!\d+)[a-zA-Z\d]{1,63}$/', $domain);
}

echo is_domain('example.com'); //true
echo is_domain('https://example.com'); //true
echo is_domain('https://.example.com'); //false
echo is_domain('https://localhost'); //false

2
^((localhost)|((?!-)[A-Za-z0-9-]{1,63}(?<!-)\.)+[A-Za-z]{2,253})$

मेरे उत्तर के लिए आधार के लिए धन्यवाद @mkyong। मैंने इसे लंबे समय तक स्वीकार्य लेबल का समर्थन करने के लिए संशोधित किया है।

इसके अलावा, "लोकलहोस्ट" तकनीकी रूप से एक मान्य डोमेन नाम है। मैं अंतर्राष्ट्रीय डोमेन नाम समायोजित करने के लिए इस उत्तर को संशोधित करूंगा।


0
/^((([a-zA-Z]{1,2})|([0-9]{1,2})|([a-zA-Z0-9]{1,2})|([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]))\.)+[a-zA-Z]{2,6}$/
  • ([a-zA-Z]{1,2}) -> केवल दो पात्रों को स्वीकार करने के लिए।

  • ([0-9]{1,2})-> केवल दो संख्या स्वीकार करने के लिए

अगर कुछ भी दो से अधिक है तो ([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9])यह regex ध्यान रखेगा।

यदि हम मिलान कम से कम एक समय के लिए करना चाहते हैं तो +इसका उपयोग किया जाएगा।


0

^ [एक-zA-Z0-9] [- एक-zA-Z0-9]। (। [Az] {2,3}) + [एक-zA-Z0-9] [az] {2,3} (। [az] {2,3})? $

काम करने वाले उदाहरण:

stack.com
sta-ck.com
sta---ck.com
9sta--ck.com
sta--ck9.com
stack99.com
99stack.com
sta99ck.com

यह एक्सटेंशन के लिए भी काम करेगा

.com.uk
.co.in
.uk.edu.in

काम नहीं करेंगे उदाहरण:

-stack.com

यह सबसे लंबे समय तक डोमेन एक्सटेंशन के साथ भी काम करेगा ".versicherung"



0

निम्नलिखित regex किसी दिए गए डोमेन के उप, मूल और tld को निकालता है:

^(?<domain>(?<domain_sub>(?:[^\/\"\]:\.\s\|\-][^\/\"\]:\.\s\|]*?\.)*?)(?<domain_root>[^\/\"\]:\s\.\|\n]+\.(?<domain_tld>(?:xn--)?[\w-]{2,7}(?:\.[a-zA-Z-]{2,3})*)))$

निम्नलिखित डोमेन के लिए परीक्षण किया गया:

* stack.com
* sta-ck.com
* sta---ck.com
* 9sta--ck.com
* sta--ck9.com
* stack99.com
* 99stack.com
* sta99ck.com
* google.com.uk
* google.co.in

* google.com
* masełkowski.pl
* maselkowski.pl
* m.maselkowski.pl
* www.masełkowski.pl.com
* xn--masekowski-d0b.pl
* xn--fiqa61au8b7zsevnm8ak20mc4a87e.xn--fiqs8s

* xn--stackoverflow.com
* stackoverflow.xn--com
* stackoverflow.co.uk

0

मैंने प्रोटोकॉल के साथ-साथ डोमेन को लाने के लिए नीचे किया था। उदाहरण: https://www.facebook.com/profile/user/ ftp ●182.282.34.337 / movies // M

नीचे दिए गए रेगेक्स पैटर्न का उपयोग करें: [a-zA-Z0-9] +: //.*? /

आपको आउटपुट मिलेगा: https://www.facebook.com/ ftp ●192.282.34.337/

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