2008-12-30 11 views
6

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

params[:domain_name].downcase.strip.match(/^[a-z0-9\-]{2,63} 
\.((a[cdefgilmnoqrstuwxz]|aero|arpa)|(b[abdefghijmnorstvwyz]|biz)| 
(c[acdfghiklmnorsuvxyz]|cat|com|coop)|d[ejkmoz]|(e[ceghrstu]|edu)|f[ijkmor]| 
(g[abdefghilmnpqrstuwy]|gov)|h[kmnrtu]|(i[delmnoqrst]|info|int)| 
(j[emop]|jobs)|k[eghimnprwyz]|l[abcikrstuvy]| 
(m[acdghklmnopqrstuvwxyz]|me|mil|mobi|museum)|(n[acefgilopruz]|name|net)|(om|org)| 
(p[aefghklmnrstwy]|pro)|qa|r[eouw]|s[abcdeghijklmnortvyz]| 
(t[cdfghjklmnoprtvwz]|travel)|u[agkmsyz]|v[aceginu]|w[fs]|y[etu]|z[amw]) 
(\.((a[cdefgilmnoqrstuwxz]|aero|arpa)|(b[abdefghijmnorstvwyz]|biz)| 
(c[acdfghiklmnorsuvxyz]|cat|com|coop)|d[ejkmoz]|(e[ceghrstu]|edu)|f[ijkmor]| 
(g[abdefghilmnpqrstuwy]|gov)|h[kmnrtu]|(i[delmnoqrst]|info|int)| 
(j[emop]|jobs)|k[eghimnprwyz]|l[abcikrstuvy]| 
m[acdghklmnopqrstuvwxyz]|mil|mobi|museum)| 
(n[acefgilopruz]|name|net)|(om|org)| 
(p[aefghklmnrstwy]|pro)|qa|r[eouw]|s[abcdeghijklmnortvyz]| 
(t[cdfghjklmnoprtvwz]|travel)|u[agkmsyz]|v[aceginu]|w[fs]|y[etu]|z[amw]))?$/) 
+2

ऐसे डोमेन के लिए आपका उपयोग केस क्या है जिसे नए डोमेन बनाए जाने पर बनाए रखने की आवश्यकता है? – mark

+0

चूंकि सभी उत्तर टीएलडी को देखने के अन्य तरीकों को देने के लिए प्रतीत होते हैं, इसलिए मैं भविष्य में नकल से बचने के लिए इस प्रश्न का नाम बदलने का प्रस्ताव करता हूं (जब तक कि लोग वास्तव में रिफैक्टरिंग प्रश्न का उत्तर देना शुरू नहीं करते) – TheSoftwareJedi

+0

अच्छा विचार - यह वास्तव में एक regexp समस्या नहीं है। – Alnitak

उत्तर

28

कृपया, कृपया ज्ञात डोमेन नामों के लिए मिलान करने के लिए इस तरह एक निश्चित और बेहद जटिल रेगेक्स का उपयोग न करें।

टीएलडी की सूची स्थिर नहीं है, खासकर आईसीएएनएन के साथ नए जीटीएलडी के लिए एक सुव्यवस्थित प्रक्रिया को देखते हुए। सीसीटीएलडी की सूची कभी-कभी बदलती है!

http://publicsuffix.org/ से उपलब्ध सूची पर एक नज़र डालें और कुछ कोड लिखें जो इसके बजाय उस सूची को डाउनलोड और पार्स करने में सक्षम है।

+0

नियमित अभिव्यक्तियों और आंखों के खून बहने के बारे में: http://www.codinghorror.com/blog/archives/001016।एचटीएमएल –

+0

फिर से कोड हटा दिया - कोई भी नोब नेट से एक फाइल पढ़ सकता है, और बिना! आदि इसे संभालना उपयोगी नहीं है। – Alnitak

+0

मुझे लगता है कि मैं सहमत हूं। ऐसा करने के बेहतर तरीके हैं, लेकिन मुझे पंजीकरण की आवश्यकता है जो पंजीकरण/स्थानान्तरण करने के लिए अविश्वसनीय रूप से है। कोई अन्य सिफारिशें? –

0

मुझे शायद डोमेन नामों के बारे में पर्याप्त जानकारी नहीं है। लेकिन डोमेन "foo.info.com" जैसे मेल खाते हैं? ऐसा लगता है कि डोमेन नाम उस विशेष मामले में "info.com" है।

और आप यह सुनिश्चित करना चाहते हैं कि नाम [ए-जेड \ डी] से शुरू होता है। मुझे नहीं लगता कि आप एक डोमेन पंजीकृत कर सकते हैं जो डैश से शुरू होता है?

+0

सभी डोमेन नाम दो भाग नहीं हैं। एक एकल भाग उदाहरण: "सीके" कुक द्वीपों के लिए डोमेन है (http: // ck या http://www.ck आज़माएं); .nz TLD के भीतर एक संरचना के कारण मेरा स्वयं का डोमेन तीन भाग (nichesoftware.co.nz) है। – Bevan

-1

खैर के रूप में आपने लिखी है, टीएलडी हिस्सा बराबर लेकिन (\.<tldpart>){1,2} से अधिक लंबी है लेकिन मुझे यकीन है कि यह दोहराव के लिए निर्धारित किया जा सकता है हूँ ...

संपादित करें: yech, नहीं, यह संभव हो सकता है, लेकिन अनिवार्य रूप से होता है मुझे लगता है कि नकल को संभालने के लिए एक बहुत धीमी ब्रूट फोर्स सूची। संभावित टीएलडी और एसएलडी + देश जोड़े को एक बड़े हैशप में डालने के लिए सरल और तेज और उसके खिलाफ सबस्ट्रिंग की जांच करें।

-1

आप रेगेक्स को स्ट्रिंग के रूप में बना सकते हैं और फिर Regexp.new (स्ट्रिंग) कर सकते हैं।

-1

मैं RFC 1035 में निर्धारित नियमों के साथ शुरू करने की सलाह दूंगा, और फिर पीछे की ओर काम कर रहा हूं - लेकिन केवल अगर आपको वाकई इसे स्क्रैच से करने की ज़रूरत है। एक डोमेन regex पैटर्न होना चाहिए (केवल ईमेल पता regex पैटर्न के लिए तर्कसंगत दूसरा) वहाँ सबसे आम बात है। मैं regexlib.com साइट देखता हूं और अन्य लोगों द्वारा किए गए ब्राउज़ के माध्यम से ब्राउज़ करता हूं।

+0

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

4

डाउनलोड इस: http://data.iana.org/TLD/tlds-alpha-by-domain.txt

उदाहरण उपयोग (अजगर में):

import re 
def validate(domain): 
    valid_domains = [ line.upper().replace('.', '\.').strip() 
         for line in open('domains.txt') 
         if line[0] != '#' ] 
    r = re.compile(r'^[A-Z0-9\-]{2,63}\.(%s)$' % ('|'.join(valid_domains),)) 
    return True if r.match(domain.upper()) else False 


print validate('stackoverflow.com') 
print validate('omnom.nom') 

आप प्रदर्शन में मदद करने के सत्यापित करें समारोह से बाहर डोमेन-सूची निर्माण कारक बन सकते हैं।

+2

awesomedomain.co.uk जैसे डोमेन के लिए परिणाम अपेक्षित नहीं हैं - टीएलडी को नहीं माना जाता है .uk यह है .co.uk http://publicsuffix.org/ –

+0

@DanEsparza जैसे कुछ का उपयोग करना बेहतर है: और फिर भी, [publicsuffix.org] (http://publicsuffix.org/) इसे "* .uk" और _not_ के रूप में "co.uk" के रूप में रिकॉर्ड करता है। –

+0

@ डेनिसविल्लियमसन '*। 'के लिए प्रविष्टि में' * 'का अर्थ है कि' .uk' का प्रत्येक _sub-domain_ स्पष्ट रूप से सूचीबद्ध_ के लिए सार्वजनिक _except है। – Alnitak

संबंधित मुद्दे