هل يمكنني تحسين شيك Regex هذا أسماء مجال صالحة؟

StackOverflow https://stackoverflow.com/questions/399932

  •  29-08-2019
  •  | 
  •  

سؤال

لذلك، كنت أعمل على اسم النطاق هذا التعبير العادي. حتى الآن، يبدو أن الاستلام أسماء النطاقات مع SLDS و TLDs (مع CCTLD اختياري)، ولكن هناك ازدواجية في قائمة TLD. هل يمكن إعادة صياغة هذا الأمر أكثر؟

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]))?$/)
هل كانت مفيدة؟

المحلول

من فضلك من فضلك من فضلك لا استخدم Regex ثابت ومتعقد بشكل فظيع مثل هذا لتتناسب مع أسماء النطاقات المعروفة.

قائمة TLDs هي ليس ثابت، لا سيما مع ICANN ينظر إلى عملية تبسيط GTLDs الجديدة. حتى قائمة التغييرات CCTLDs في بعض الأحيان!

إلقاء نظرة على القائمة المتاحة من http://publicsuffix.org/ واكتب بعض التعليمات البرمجية التي يمكن تنزيلها وتحليلها بدلا من ذلك.

نصائح أخرى

حمل هذا: 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')

يمكنك عامل بناء قائمة المجال من وظيفة التحقق من الصحة للمساعدة في الأداء.

أنا لا أعرف ما يكفي حول أسماء النطاقات ربما. ولكن لماذا تنطوي المجالات "foo.info.com" مطابق؟ يبدو أن اسم المجال هو "info.com" في تلك الحالة بالذات.

وقد ترغب في التأكد من بدء الاسم مع [AZ D]. لا أعتقد أنه يمكنك تسجيل مجال يبدأ باندفاعة؟

حسنا، كما لديك مكتوبة، الجزء TLD هو ما يعادل ولكن أطول من (\.<tldpart>){1,2} لكنني متأكد من أنه يمكن أن تكون ثابتة للاكرتياز ...

تحرير: yech، لا، سيكون من الممكن ولكن أساسا قائمة القوة الغاشمة بطيئة للغاية للتعامل مع الازدواجية التي أعتقد أنها. أبسط وأسرع لوضع أزواج TLD و SLD + محتملة في Hashmap كبيرة وتحقق من السلسلة الفرعية مقابل ذلك.

أود أن أوصي بدءا من القواعد المنصوص عليها في RFC 1035., ، ثم العمل للخلف - ولكن فقط إذا كنت حقا بحاجة حقا للقيام بذلك من الصفر. يجب أن يكون نمط Regex المجال (قابل للجدول الثاني فقط إلى أنماط عنوان البريد الإلكتروني Regex) أكثر الأشياء شيوعا هناك. سوف تحقق من الموقع regexlib.com. وتصفح ما فعله الناس الآخرون.

يمكنك بناء Regex كسلسلة ثم do regexp.new (سلسلة).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top