2017-10-05 107 views
0

示例领域:http://мппм.рф验证非英文域名

转换域转换成ASCII后,它变成了:Xn--l1aaia.xn--p1ai

但我现有的PHP函数来有效域返回false。

现有的功能来验证域

function ValidateDomain($domain) 
{ 
    if(!preg_match("/^([-a-z0-9]{2,100})\.([a-z\.]{2,24})$/i", $domain)) 
    { 
     return false; 
    } 
    return $domain; 
} 

我曾尝试以下一个验证域

if(!preg_match('/^(http|https|ftp):\/\/([A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?/i', $domain)) 
+0

关闭问题有一个已关闭本身具有不可思议答案不是很好。我为Lawrence Cherone的行为道歉。但他已经有权关闭你的问题。 –

回答

1

我认为мппм.рф已经是UTF8,所以强制转换也无济于事。正则表达式是相当简单的,并且可以通过这样的替换:

function validateDomain($domain) 
{ 
    $parts  = explode('.',$domain); 
    $name  = array_shift($parts); 
    $extension = implode('.',$parts); 
    if ((strlen($name) >= 2) && (strlen($name) <= 100) && 
     (strlen($extension) >= 2) && (strlen($extension) <= 24)) return $domain; 
    else return FALSE;  
} 

它会工作相同,而且对非AZ字符,它是当它使用正则表达式的情况下更容易理解。你可以把它稍微更加紧凑和有效的,这样做:

function validateDomain($domain) 
{ 
    $parts = explode('.',$domain); 
    $nameLen = strlen(array_shift($parts)); 
    $extLen = strlen(implode('.',$parts)); 
    if(($nameLen >= 2) && ($nameLen <= 100) && 
     ($extLen >= 2) && ($extLen <= 24)) return $domain; 
    else return FALSE;  
} 

你也可以使用多字节字符串函数是这样的:

function validateDomain($domain) 
{ 
    $point = mb_strpos($domain,'.'); 
    $nameLen = mb_strlen(mb_substr($domain,0,$point)); 
    $extLen = mb_strlen(mb_substr($domain,$point+1)); 
    if(($nameLen >= 2) && ($nameLen <= 100) && 
     ($extLen >= 2) && ($extLen <= 24)) return $domain; 
    else return FALSE;  
} 
+0

对不起,我的意思是转换成ASCII – Hassaan

+0

谢谢但解决方案不起作用。你测试过了吗? – Hassaan

+0

我认为你完全有能力理解这个意图,并纠正我可能犯的任何错误。无论如何,“不起作用”总是对问题的错误描述,不应该用于SO。我看到我有一个'<='指向错误的方向。我纠正了这一点。 –