如何在PHP中验证域名?

2022-08-30 12:30:07

不使用正则表达式是否可能?

例如,我想检查字符串是否为有效域:

domain-name
abcd
example

是有效的域。这些当然是无效的:

domaia@name
ab$%cd

等等。所以基本上它应该以字母数字字符开头,然后可能有更多的alnum字符加上连字符。它也必须以一个alnum字符结束。

如果这是不可能的,你能建议我一个正则表达式模式来做到这一点吗?

编辑:

为什么这不起作用?我是否错误地使用了preg_match?

$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');
}

答案 1
<?php
function is_valid_domain_name($domain_name)
{
    return (preg_match("/^([a-z\d](-*[a-z\d])*)(\.([a-z\d](-*[a-z\d])*))*$/i", $domain_name) //valid chars check
            && preg_match("/^.{1,253}$/", $domain_name) //overall length check
            && preg_match("/^[^\.]{1,63}(\.[^\.]{1,63})*$/", $domain_name)   ); //length of each label
}
?>

测试用例:

is_valid_domain_name? [a]                       Y
is_valid_domain_name? [0]                       Y
is_valid_domain_name? [a.b]                     Y
is_valid_domain_name? [localhost]               Y
is_valid_domain_name? [google.com]              Y
is_valid_domain_name? [news.google.co.uk]       Y
is_valid_domain_name? [xn--fsqu00a.xn--0zwm56d] Y
is_valid_domain_name? [goo gle.com]             N
is_valid_domain_name? [google..com]             N
is_valid_domain_name? [google.com ]             N
is_valid_domain_name? [google-.com]             N
is_valid_domain_name? [.google.com]             N
is_valid_domain_name? [<script]                 N
is_valid_domain_name? [alert(]                  N
is_valid_domain_name? [.]                       N
is_valid_domain_name? [..]                      N
is_valid_domain_name? [ ]                       N
is_valid_domain_name? [-]                       N
is_valid_domain_name? []                        N

答案 2

这样,您不仅可以检查域是否具有有效的格式,还可以检查它是否处于活动状态/分配了IP地址。

$domain = "stackoverflow.com";

if(filter_var(gethostbyname($domain), FILTER_VALIDATE_IP))
{
    return TRUE;
}

请注意,此方法要求 DNS 条目处于活动状态,因此,如果您需要在不在 DNS 中验证域字符串,请使用上面 velcrow 给出的正则表达式方法。

此外,此函数不用于验证 URL 字符串使用FILTER_VALIDATE_URL。我们不会对域使用FILTER_VALIDATE_URL,因为域字符串不是有效的 URL。


推荐