Pre Exam Test Practice (SSC | Banking | IAS | GATE | State Level | CLAT | Railways | Insurance | Teaching Exams | NDA | Defence | IES |State Exam )

Organizational Research By

Surprising Reserch Topic

how to validate domain name in php

how to validate domain name in php  using -'php,regex,domain-name'

Is it possible without using regular expression?

For example, I want to check that a string is a valid domain:


Are valid domains. These are invalid of course:


And so on. So basically it should start with an alphanumeric character, then there may be more alnum characters plus also a hyphen. And it must end with an alnum character, too.

If it's not possible, could you suggest me a regexp pattern to do this?


Why doesn't this work? Am I using preg_match incorrectly?

$domain = '@djkal';
$regexp = '/^[a-zA-Z0-9][a-zA-Z0-9\-\_]+[a-zA-Z0-9]$/';
if (false === preg_match($regexp, $domain)) {
    throw new Exception('Domain invalid');


asked Sep 29, 2015 by mannumits1
0 votes

Related Hot Questions

Government Jobs Opening

answered Sep 29, 2015 by deepak
0 votes

This post explain how to validate check domain name is valid or not

  • Domain Name Must contain Alpha Numeric
  • Only special character (-) hyphen. is allowed on domain names.
  • Check the generic domain extension (.com, .edu, .gov, .int, .mil, .net, and .org)
  • All International domain extensions (TLDs) approved by ICANN
answered Sep 29, 2015 by bhavin
0 votes

Check the php function checkdnsrr

function validate_email($email){

   $exp = "^[a-z\'0-9]+([._-][a-z\'0-9]+)*@([a-z0-9]+([._-][a-z0-9]+))+$";


        return true;
        return false;


      return false;

answered Sep 29, 2015 by maurya
0 votes

A valid domain is for me something I'm able to register or at least something that looks like I could register it. This is the reason why I like to separate this from "localhost"-names.

And finally I was interested in the main question if avoiding Regex would be faster and this is my result:

    // and localhost- are not allowed
    || $name[0] == '.' || $name[0] == '-' || $name[ $len - 1 ] == '.' || $name[ $len - 1 ] == '-'
    // is the shortest possible domain name and needs one dot
    || ($domain_only && ($len < 4 || strpos($name, '.') === false))
    // several combinations are not allowed
    || strpos($name, '..') !== false
    || strpos($name, '.-') !== false
    || strpos($name, '-.') !== false
    // only letters, numbers, dot and hypen are allowed
    // a little bit slower
    || !ctype_alnum(str_replace(array('-', '.'), '', $name))
    || preg_match('/[^a-z\d.-]/i', $name)
    ) {
        return false;
    // each label may contain up to 63 characters
    $offset = 0;
    while (($pos = strpos($name, '.', $offset)) !== false) {
        if ($pos - $offset > 63) {
            return false;
        $offset = $pos + 1;
    return $name;

Benchmark results compared with velcrow 's function and 10000 iterations (complete results contains many code variants. It was interesting to find the fastest.):

filter_hostname($domain);// $domains: 0.43556308746338 $real_world: 0.33749794960022
is_valid_domain_name($domain);// $domains: 0.81832790374756 $real_world: 0.32248711585999

$real_world did not contain extreme long domain names to produce better results. And now I can answer your question: With the usage of ctype_alnum() it would be possible to realize it without regex, but as preg_match() was faster I would prefer that.

If you don't like the fact that "" is a valid domain name use this function instead that valids against a public tld list. Maybe someone finds the time to combine both.

answered Sep 29, 2015 by sanjaypal1983
0 votes

This is simple. Some php egnine has a problem with split(). This code below will work.

answered Sep 29, 2015 by vijayshukla80