Closed. This question needs to be more focused。它当前不接受答案。
想要改善这个问题吗?更新问题,使其仅关注editing this post一个问题。
已关闭6年。
Improve this question
我想验证php中的域名url可能是国际化的域名格式,例如希腊文
域名= http://παράδειγμα.δοκιμή
他们有使用正则表达式验证它的任何方法吗?
编码后,该域将传递任何traditional regex check
简单验证:
编辑:
如果您想进行真正的DNS验证,则可以使用dns_get_record(PHP 5)或gethostbyaddr
例如
结果:
想要改善这个问题吗?更新问题,使其仅关注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