如何验证国际化域名

use*_*981 7 php regex dns

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

Gre*_*ver 2

这是IDN域,我首先将其转换为弱代码版本,然后验证域。

\n\n

但如果你真的想通过正则表达式验证

\n\n
<?php\n\n$domain = \'\xcf\x80\xce\xb1\xcf\x81\xce\xac\xce\xb4\xce\xb5\xce\xb9\xce\xb3\xce\xbc\xce\xb1.gr\';\n$regex = \'#^([\\w-]+://?|www[\\.])?([^\\-\\s\\,\\;\\:\\+\\/\\\\\\?\\^\\`\\=\\&\\%\\"\\\'\\*\\#\\<\\>]*)\\.[a-z]{2,7}$#\';\nif (preg_match($regex, $domain)) {\n    echo "VALID";\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

但这会让您出现误报,因为验证 idn 域确实很复杂,我试图验证其中不存在无效字符,但列表并不完整。

\n\n

最好将之前转换为双关语代码

\n\n
$regex = \'#^([\\w-]+://?|www[\\.])?[a-z0-9]+[a-z0-9\\-\\.]*[a-z0-9]+\\.[a-z]{2,7}$#\';\nif (preg_match($regex, idn_to_ascii($domain))) {\n    echo "VALID";\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您还想测试域名是否可以解析,请尝试:

\n\n
$regex = \'#^([\\w-]+://?|www[\\.])?[a-z0-9]+[a-z0-9\\-\\.]*[a-z0-9]+\\.[a-z]{2,7}$#\';\n$punny_domain = idn_to_ascii($domain);\nif (preg_match($regex, $punny_domain)) {\n    if (gethostbyname($punny_domain) != $punny_domain) {\n        echo "VALID";\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n