Closed. This question needs to be more focused。它当前不接受答案。












想要改善这个问题吗?更新问题,使其仅关注editing this post一个问题。

已关闭6年。



Improve this question




我想验证php中的域名url可能是国际化的域名格式,例如希腊文
域名= http://παράδειγμα.δοκιμή
他们有使用正则表达式验证它的任何方法吗?

最佳答案

这就是所谓的IDN domain
支持IDN域的客户端使用RFC 5890中指定的IDNA2008标准对其进行规范化,然后在提交DNS解析之前使用Punycode中定义的RFC 3492编码替换其余的unicode字符。

根据规范,UTF-8字符集中的每个字符实际上都可以在IDN域中使用,但是每个顶级域授权机构都可以在Unicode字符集中定义有效字符,因此create and maintain a real regex很难。

如果要在应用程序中接受IDN域,则应在内部使用编码版本。 PHP extension intl带来了两个对IDN域名进行编码和解码的功能

echo idn_to_ascii('täst.de');



编码后,该域将传递任何traditional regex check

简单验证:
$url = "http://example.com/";
if (preg_match('/^(http|https|ftp):\/\/([A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?/i', $url)) {
    echo 'OK';
} else {
    echo 'Invalid URL.';
}

编辑:

如果您想进行真正的DNS验证,则可以使用dns_get_record(PHP 5)或gethostbyaddr

例如
$domain = 'ελληνικά.idn.icann.org';
$idnDomain = idn_to_ascii( $domain );

if ( $dnsResult = dns_get_record( $idnDomain, DNS_ANY ) )
{
    echo $idnDomain , "\n";
    print_r( $dnsResult );
}
else
{
    echo "failed to lookup domain\n";
}

结果:
xn--hxargifdar.idn.icann.org
Array
(
    [0] => Array
    (
        [host] => xn--hxargifdar.idn.icann.org
        [class] => IN
        [ttl] => 21456
        [type] => A
        [ip] => 199.7.85.10
    )
    [1] => Array
    (
        [host] => xn--hxargifdar.idn.icann.org
        [class] => IN
        [ttl] => 21600
        [type] => AAAA
        [ipv6] => 2620::2830:230:0:0:0:10
    )
)

10-04 16:59