正则表达式验证西里尔文域

che*_*eks 1 php regex validation

我需要编写一个正则表达式来验证拉丁文和西里尔文域名。我写了这个函数,但它不适用于 Cyrillic 域。告诉我出了什么事?

function isDomain($url)
    {
        if (mb_strlen($url)==0) return false;
        $url = mb_strtolower(trim($url));
        $abc = '?????????????????????????????????';
        if(!preg_match('/^(['.$abc.'a-z0-9\.-]{1,64})?\.(?:??|ru|su|com|net|org|mil|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{3})$/i',$url))
        {
            return FALSE; 
        } else {
            return TRUE;
        }
    }
Run Code Online (Sandbox Code Playgroud)

SQB*_*SQB 5

  1. 使用 POSIX 类\p{Cyrillic}
  2. 使用修饰符/u来匹配 UniCode。
  3. ??在您的 TLD 列表中使用 Unicode 代码点。

还有一个观察:长度为 3 的 TLD 已经与 匹配[a-z]{3},因此我们可以将它们排除在列表之外。

function isDomain($url)
{
    if (mb_strlen($url)==0) return false;
    $url = mb_strtolower(trim($url));
    return preg_match('/^([\p{Cyrillic}\p{Latin}\d\.-]{1,64})?\.(?:\x{0440}\x{0444}|ru|su|arpa|info|aero|name|[a-z]{3})$/iu',$url);
}
Run Code Online (Sandbox Code Playgroud)

请参阅我在Regex101.com 上的示例。