我需要编写一个正则表达式来验证拉丁语和西里尔语域名。 我写了这个函数,但它不适用于西里尔域。 告诉我出了什么问题?
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;
}
}
答案 0 :(得分:4)
\p{Cyrillic}
。 /u
匹配UniCode。 рф
的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上的示例。
答案 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})