[REGEX] domein valideren

Pagina: 1
Acties:
  • 167 views sinds 30-01-2008
  • Reageer

  • turkosh
  • Registratie: December 2003
  • Laatst online: 26-04-2025
Hoi,

Ik ben bezig met een regex voor het valideren van een texveld op geldige domeinnamen (b.v. tweakers.net)
Ik ben erg ver opgeschoten voor een regex newbie. Op dit moment heb ik het volgende in mijn validation.xml staan:
[code]
^[a-zA-Z0-9][a-zA-Z0-9\-\.]*[\.][a-zA-Z]{2,3}$
[\code]

met dit kan ik alle soorten domeinen valideren:

xx.xx
xx.xx.xx
xx-xx.xx.xx etc.

Maar deze regex valideert op dit moment ook domeinen met "--", ".." in de string. Hoe kan ik die eruit filteren in mijn regex?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Je doet nogal vreemde dingen...
code:
1
^([a-zA-Z0-9][a-zA-Z0-9-]*\.){1,2}[a-zA-Z]{2,6}$

Dat lijkt me al beter te moeten werken. Jouw regexp hield sowieso geen rekening met bijvoorbeeld het .museum TLD. Mijn regexp is trouwens ook niet perfect: www.iets.co.uk zou niet matchen, maar hoe je dat werkend krijgt kun je nu vast wel zelf uitvinden. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 04:38
Voordat je regular expressions gaat schrijven, moet je eerst bedenken wat een domeinnaam is. Het komt er op neer dat een domeinnaam bestaat uit een aantal labels, gescheiden door punten. Als je een expressie X hebt voor een label, dan is een reguliere expressie voor de domeinnaam dus ^X(\.X)*$. Nu is een enkel label ook een geldige domeinnaam, als je er minstens één punt in wil hebben kun je ^X(\.X)+ schrijven.

Nu is het de vraag: wat is X precies? Een label bestaat uit letters, cijfers en streepjes, maar mag niet met een streepje beginnen of eindigen ("a--z.com" is dus daadwerkelijk een geldig domein). Sommige TLD's hebben nog extra eisen, zoals dat in Nederland een label niet uit alleen cijfers mag bestaan, maar daar kun je in het algemeen niet van uitgaan. Je begint dus met een letter of cijfer, dan optioneel letters, cijfers en streepjes en weer een letter of cijfer: [A-Za-z0-9]([-A-Za-z0-9]*[A-Za-z0-9])?. Merk op dat het noodzakelijk is om ook het laatste karakter optioneel te maken, omdat je ook labels met maar één letter hebt ("x.org", bijvoorbeeld).

Nu kun je die expressie invoegen in de eerdere expresssie en dan krijg je dus: ^[A-Za-z0-9]([-A-Za-z0-9]*[A-Za-z0-9])?(\.[A-Za-z0-9]([-A-Za-z0-9]*[A-Za-z0-9])?)*$
Dat is nogal lang en lastig te lezen en dat is ook een probleem met reguliere expressies: als je weet waar je mee bezig bent kun je ze goed construeren, maar ze zijn lastig te lezen en te onderhouden.

Je kunt het wel iets makkelijker maken door zelf eerst een punt voor de domeinnaam te zetten; de reguliere expressie wordt dan namelijk ^(.X)+$ en volledig ingevuld: ^(\.[A-Za-z0-9]([-A-Za-z0-9]*[A-Za-z0-9])?)*$. Dat is al een stuk korter en je voorkomt de duplicatie van code enigzins. Ook kun je, als je POSIX of Perl expressies gebruikt, de character classes korter opschrijven.

Nu accepteer je trouwens ook domeinnamen als "abc.xyv", wat waarschijnlijk niet bestaat, maar dat kun je toch nooit controleren zonder een DNS lookup te doen.

[ Voor 43% gewijzigd door Soultaker op 16-09-2005 17:02 ]


Verwijderd

Ik zou ook eerder een DNS-resolve proberen te doen dan een regexp gaan schrijven hiervoor, aangezien de regexp alleen de vorm valideert, en niet of het domein ook werkelijk bestaat (en bereikbaar is).

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 04:38
Ik weet niet precies wat de context is, maar reguliere expressies zijn vaak handig om snel te kunnen controleren op overduidelijke typefouten (een spatie in een domeinnaam, bijvoorbeeld, of een komma in plaats van een punt). Als het domein niet aan de vorm (reguliere expressie) voldoet is 'ie immers zeker niet geldig. Voor formulieren op het web zijn ze bijvoorbeeld erg handig omdat je ze client side kunt toepassen.

Maar je hebt gelijk: als je met zekerheid wil weten of een domein bestaat (wat meer is dan dat 'ie een geldige naam heeft) moet je uiteindelijk een DNS lookup doen.

Verwijderd

code:
1
^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$
Checks domain names. This validates domains based on latest specifications (RFCs 952 and 1123 dealing with hostnames and RFC 1035 dealing with domain name system requirements) except that it only includes realistic fully-qualified domains: 1. requires at least one subdomain 2. allows shortest top-level domains like "ca", and "museum" as longest. Other validation rules: 1. Labels/parts should be seperated by period. 2. Each label/part has maximum of 63 characters. 3. First and last character of label must be alphanumeric, other characters alphanumeric or hyphen. 4. Does not check maxlength of domain which incidentally is 253 characters of text (255 binary representation). For a regular expression that matches ALL domains: ^([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])?$
regexlib source
Pagina: 1