正则表达式验证西里尔字段

时间:2013-11-15 14:32:34

标签: php regex validation

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

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

2 个答案:

答案 0 :(得分:4)

  1. 使用POSIX类\p{Cyrillic}
  2. 使用修饰符/u匹配UniCode。
  3. 在您的TLD列表中使用рф的Unicode代码点。
  4. 另外一个观察结果:长度为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上的示例。

答案 1 :(得分:0)

(?:рф|ru|su|com|net|org|mil|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{3})

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

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