Қосалқы домен үшін Regexp

a-zA-Z0-9 .- (әріптер, сандар, нүктелер және сызықтар) ешқашан басталмаған немесе аяқталмайтын BUT -қа рұқсат беретін regexp-ды қалай жазуды біледі нүкте немесе сызықпен?

Мен бұны көрдім:

/^[^.-][a-zA-Z0-9.-]+[^.-]$/

... бірақ «Джон @» сияқты бір нәрсе жазсам, ол жұмыс істейді, сондықтан мен @ рұқсат етілмегенін қаламаймын.

20
Регрес хош иісі қандай? (perl, egrep, awk, vim, JavaScript ...)
қосылды автор Benoit, көзі

7 жауаптар

Subdomain

Сәйкес келетін интернет ұсыныстарына сәйкес ( RFC3986 бөлім 2.2 , бұл өз кезегінде) : RFC1034 бөлім 3.5 және RFC1123 бөлім 2.1 ), субдомен (DNS доменінің хост атауының бөлігі болып табылатын) бірнеше талаптарға сай болуы керек:

  • Әрбір субдоменнің бөлігі 63 ұзындығынан аспауы керек.
  • Әрбір қосалқы доменің бөлігі альфа-сандық (яғни [A-Za-z] немесе сандар [0-9] ) әріптерімен басталуы және аяқталуы керек).
  • Әрбір қосалқы доменде сызықша (сызықша) болуы мүмкін, бірақ сызықшамен басталуы немесе аяқталмауы мүмкін.

Төменде осы талаптарға жауап беретін субдомен бөлігі үшін өрнек үзіндісі келтірілген:

[A-Za-z0-9](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?

Бұл өрнектің фрагменті бір ғана пайдаланылмауы керек екенін ескеріңіз - бұл үлкен мәнмәтіндегі шекаралық шарттарды қосуды талап етеді, бұл DNS хост атауы үшін келесі өрнекте көрсетілгендей ...

DNS хост атауы

Аталған хост (IP-адрес емес), қосымша талаптарға сай болуы керек:

  • The host name may consist of multiple Subdomain parts, each separated by a single dot.
  • The length of the overall host name should not exceed 255 characters.
  • The top level domain, (the rightmost part of the DNS хост атауы), must be one of the internationally recognized values. The list of valid top level domains is maintained by IANA.ORG. (See the bare-bones current list here: http://data.iana.org/TLD/tlds-alpha-by-domain.txt).

With this is mind, here a commented regex (in PHP syntax), which will pseudo-validate a DNS хост атауы: (Note that this incorporates a modified version of the above expression for a Subdomain and adds comments to this as well).

Update 2016-08-20: Since this answer was originally posted back in 2011, the number of top-level domains has exploded. As of August 2016 there are now more than 1400. The original regex to this answer incorporated all of these but this is no loger practical. The new regex below incorporates a different expression for the top-level domain. The algorithm comes from: Top Level Domain Name Specification draft-liman-tld-names-06.

$DNS_named_host = '%(?#!php/i DNS_named_host Rev:20160820_0800)
    # Match DNS named host domain having one or more Subdomains.
    # See: http://stackoverflow.com/a/7933253/433790
    ^                     # Anchor to start of string.
    (?!.{256})            # Whole domain must be 255 or less.
    (?:                   # One or more sub-domains.
      [a-z0-9]            # Subdomain begins with alpha-num.
      (?:                 # Optionally more than one char.
        [a-z0-9-]{0,61}   # Middle part may have dashes.
        [a-z0-9]          # Starts and ends with alpha-num.
      )?                  # Subdomain length from 1 to 63.
      \.                  # Required dot separates Subdomains.
    )+                    # End one or more sub-domains.
    (?:                   # Top level domain (length from 1 to 63).
      [a-z]{1,63}         # Either traditional-tld-label = 1*63(ALPHA).
    | xn--[a-z0-9]{1,59}  # Or an idn-label = Restricted-A-Label.
    )                     # End top level domain.
    $                     # Anchor to end of string.
    %xi'; //End $DNS_named_host.

Бұл өрнек мінсіз емес екенін ескеріңіз. Бір немесе одан да көп субдоменді талап етеді, бірақ техникалық тұрғыда хосттың субдомені жоқ TLD-дан (бірақ бұл сирек) болуы мүмкін.

Update 2014-08-12: Added simplified expression for Subdomain which does not require alternation.

Update 2016-08-20: Modified DNS хост атауы regex to (more generally) match the new vast number of valid top level domains. Also, trimmed out unnecessary material from answer.

64
қосылды
@algorhythm - RFC-тің түсіндірмесі - қос сызықша өте жақсы, бірақ әр субдомен бөлігі сызықшамен басталуы немесе аяқталмауы мүмкін.
қосылды автор ridgerunner, көзі
@Qqwy - Ия, сен мүлдем дұрыс. Біраз уақыт өткенде, мен оны көрсету үшін жауапты жаңартамын. Пікіріңізге рақмет!
қосылды автор ridgerunner, көзі
Ақыр соңында, бұл біраз уақытты түзету үшін біраз уақытты тапты.
қосылды автор ridgerunner, көзі
жауап қабылдануы тиіс. Мен көрмеген нәрсе бар ма?
қосылды автор Yusuf Uzun, көзі
Бұл жақсы өрескел тексеру, бірақ төменгі сызықтар мүлдем заңды болып табылады ^ \ w (?: [\ W- ] Субдомендік бөліктер үшін {0,61} \ w)? $ өте жақсы жұмыс істейді, іс жүзінде srv жазбалары оларды талап етеді кәдімгі қосалқы домендермен соқтығысуды болдырмау үшін. fyi екі жақты сызықша Punycode үшін жұмыс істеу үшін . Әрине, бұл жазбаларды кейбір жазбалар түрлеріне шектеуіңізге болады, бірақ сіз осы немесе басқа нәрсе үшін кішкене талдаушы жазуыңыз керек.
қосылды автор sg3s, көзі
Hmm, менің ойымша, қосарланған «-» де дұрыс емес, бірақ бұл тізіліммен мүмкін бе?
қосылды автор algorhythm, көзі
Annotation 2016-де берілген DNS хост атауының рұқсатынан басқа көп рұқсат етілген TLD бар екенін ескеріңіз.
қосылды автор Qqwy, көзі
Бұл сұраққа рахмет
қосылды автор swietyy, көзі
үлкен рахмет, үлкен жауап!
қосылды автор Pedro Emilio Borrego Rached, көзі

Алфавиттік-сандық белгілермен шектелген бірінші және соңғы таңбалар қажет. Енді сіз бірінші және соңғы таңбалардың нүкте мен сызықтан өзгеше болуына мүмкіндік бересіз. Бұл сипаттамаға сәйкес келеді:

/^[a-zA-Z0-9][a-zA-Z0-9.-]+[a-zA-Z0-9]$/
8
қосылды
test.subdomain..com-те ол орындалмады
қосылды автор Dinesh Patra, көзі
Мүмкін, астын сызу (_) да рұқсат етілуі керек. Және кішігірім ескерту: бұл regexp /^ \ w [\ w .-] + \ w $/i
қосылды автор RReverser, көзі
PHP үшін. Көмекіңізге рахмет, бұл жақсы жұмыс істейді: [a-zA-Z0-9] [a-zA-Z0-9] - [a-zA-Z0-9]
қосылды автор user1018527, көзі

Біздің жобамызда осыған ұқсас субдомендерге сәйкес келеміз

Клиент JS

^([A-Za-z0-9](?:(?:[-A-Za-z0-9]){0,61}[A-Za-z0-9])?(?:\.[A-Za-z0-9](?:(?:[-A-Za-z0-9]){0,61}[A-Za-z0-9])?){2,})$

Серверлік Ruby

\A([A-Za-z0-9](?:(?:[-A-Za-z0-9]){0,61}[A-Za-z0-9])?(?:\.[A-Za-z0-9](?:(?:[-A-Za-z0-9]){0,61}[A-Za-z0-9])?){2,})\z
2
қосылды

Міне, басқа біреуге көмектесетін DOMAIN + SUBDOMAIN шешім:

   /^([a-zA-Z0-9]([-a-zA-Z0-9]{0,61}[a-zA-Z0-9])?\.)?([a-zA-Z0-9]{1,2}([-a-zA-Z0-9]{0,252}[a-zA-Z0-9])?)\.([a-zA-Z]{2,63})$/

ол келесі хай сынақтарынан өтеді:

const expect = require('chai').expect;

function testDomainValidNamesRegExp(val) {
    let names = /^([a-zA-Z0-9]([-a-zA-Z0-9]{0,61}[a-zA-Z0-9])?\.)?([a-zA-Z0-9]([-a-zA-Z0-9]{0,252}[a-zA-Z0-9])?)\.([a-zA-Z]{2,63})$/;
    return names.test(val);
} 

let validDomainNames = [
    "example.com",
    "try.direct",
    "my-example.com",
    "subdomain.example.com",
    "example.com",
    "example23.com",
    "regexp-1222.org",
    "read-book.net",
    "org.host.org",
    "org.host.org",
    "velmart.shop-products.md",
    "ip2email.terronosp-222.lb",
    "stack.com",
    "sta-ck.com",
    "sta---ck.com",
    "9sta--ck.com",
    "sta--ck9.com",
    "stack99.com",
    "99stack.com",
    "sta99ck.com",
    "sub.do.com",
    "ss.sss-ss.ss",
    "s.sss-ss.ss",
    "s.s-s.ss",
    "test.t.te"
    ];

let invalidDomainNames = [
     "example2.com222",
     "@example.ru:?",
     "example22:89",
     "@[email protected]@22-",
     "example.net?1222",
     "example.com:8080:",
     ".example.com:8080:",
     "---test.com",
     "$dollars$.gb",
     "sell-.me",
     "[email protected]",
     "mem-.wer().or%:222",
     "pop().addjocker.lon",
     "regular-l=.heroes?",
     " ecmas cript-8.org ",
     "example.com::%",
     "example:8080",
     "example",
     "examaple.com:*",
    "-test.test.com",
    "-test.com",
    "dd-.test.com",
    "dfgdfg.dfgdf33.e",
    "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd-.test.com",
    "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd.testttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt.com",
    "d-.test.com"
];

describe("Test Domain Valid Names RegExp",() => {
    validDomainNames.forEach((val) => {
        it(`Text: ${val}`,() => {
            expect(testDomainValidNamesRegExp(val)).to.be.true;
        });
    });
});

describe("Test Domain Invalid Names RegExp",() => {
    invalidDomainNames.forEach((val) => {
        it(`Text: ${val}`,() => {
            expect(testDomainValidNamesRegExp(val)).to.be.false;
        });
    });
});

Көптеген сынақтар өте қуанышты!

1
қосылды
шағын түзету және тағы бір сынақпен жаңартылады
қосылды автор Vasili Pascal, көзі

Бұл әрекетті байқап көріңіз:

/^[a-zA-Z0-9][a-zA-Z0-9.-]*[a-zA-Z0-9]$/

БІРАҚ жолдың ұзындығы кемінде 2 таңбадан тұруы керек: a-zA-Z0-9 және a-zA-Z0-9. Бұған жол бермеу үшін осы тізімді қолдануға болады:

/^[a-zA-Z0-9][a-zA-Z0-9.-]*$/

Бірақ жолдың соңы нүкте де, сызықша да болмайтынын қамтамасыз ету үшін қосымша тексеру жасаңыз.

1
қосылды

Бұл regex көріңіз:

^(?![-.])[a-zA-Z0-9.-]+(?
0
қосылды

[A-zA-Z0-9] [a-zA-Z0-9 .-] * [a-zA-Z0-9] $/ Кодыңыздағы мәселе бастапқы және аяқталатын кез келген таңбалардан басқа [^ .-] болды. '.' немесе «-» барлық таңбаларға сәйкес келеді және міндетті емес [a-zA-Z0-9]

0
қосылды