This is not really specific to PHP (although the information might be useful
for all that form validation we all do), and for that I apologize in advance
(does anyone know of a regex mailing list?), but maybe someone here can help
with the following:

I find no good regex for checking valid domain names.  None that I have seen
take into account the fact that, although dashes ("-") and dots (".") are
allowed in a domain name, the domain name can neither begin with nor end
with a dash or dot, and additionally, two dashes or two dots in a row are
not allowed and a dash followed by a dot or a dot followed by a dash are not

So, I've come up with two regex's for checking domain names. The first one
checks that the name contains alphanumerics, the dash and the dot, and
neither begins with or ends with a dash or dot:


The second one checks that two dashes and two dots are not together and that
a dash followed by a dot or a dot followed by a dash are not together:


Putting it all together, the way I check for a valid domain name is with the

   if (eregi("^[a-z0-9]$|^[a-z0-9]+[a-z0-9.-]*[a-z0-9]+$", $domain_name) !=
      OR eregi("--|\.\.|-\.|\.-", $domain_name) == true

So, my question (finally!) is this:

Is there any way to combine both expressions (basically, one part that
checks for false and one part that checks for true) into one regex that just
returns true or false?  I haven't been able to find any documentation that
shows me how to do that, basically a "like this but not like this" syntax.

BTW, anticipating someone mentioning the fact that the above regex's don't
check for a domain name ending with a dot followed by three characters max
(as in .com, .net, etc.), it's because that long-held truth is no longer
true.  We now have .info and .museum, and who know what the future will

About the only truth left is that domain names end in a dot followed by two
characters minimum (there are the country code domains like .us, .de. etc.
but there are no one character TLD's at present and I would expect perhaps
not for a long long time, but you never know).  Perhaps someone would expand
on the regex above to include checking for a name ending with a dot followed
by two characters minimum, I just haven't been into regex's long enough to
know how).

Of course, you could get really anal about all this and check for domain
names that only end in the current ICANN root server TLD's (about 260 or so,
I believe), but that wouldn't account for TLD's that operate within other
root servers (there's always sumthin').  Anyways,

Any help with the above is certainly appreciated!


PHP General Mailing List (
To unsubscribe, visit:

Reply via email to