【问题标题】:regex validation cyrillic domain正则表达式验证西里尔文域
【发布时间】:2013-11-15 14:32:33
【问题描述】:

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

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;
        }
    }

【问题讨论】:

  • 问题是缺少 mb_internal_encoding ('UTF-8');

标签: php regex validation


【解决方案1】:
  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);
}

Regex101.com 上查看我的示例。

【讨论】:

  • 您有想要匹配的域的示例吗?
  • 例如 абебебу.рф
  • 在我更新的答案中查看 regex101 的链接。最后一个问题是域名 .рф;我们需要提供这两个字符作为 Unicode 代码点。
  • 嗯,这很奇怪。它曾经在 Regex101 上工作,但今天点击链接,它没有。
【解决方案2】:
(?:рф|ru|su|com|net|org|mil|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{3})

如果您在末尾添加 [a-z]{3},列出所有这些是没有用的!你可以写:

(?:рф|[a-z]{3-4})

【讨论】:

  • 我对另一个问题感兴趣,为什么没有验证西里尔文域?
  • 我想你的意思是写[a-z]{3,4}
  • @Amine :关于 {3-4},我搞砸了。 OP:您可以尝试使用“\p{L}”,它匹配一个字母字符(在任何字符集中)。