【问题标题】:Validate non-english domains [duplicate]验证非英语域 [重复]
【发布时间】:2017-10-05 07:41:09
【问题描述】:

示例域:http://мппм.рф

domain转换成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) )

【问题讨论】:

  • 用一个本身已经关闭并且答案很奇怪的问题来关闭一个问题并不是很好。我为 Lawrence Cherone 的行为道歉。但他赢得了关闭你的问题的权利。

标签: php regex validation


【解决方案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;      
}

它的工作原理相同,但也适用于非 a-z 字符,并且比使用正则表达式时更容易理解。您可以通过这样做使其更加紧凑和高效:

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

【讨论】:

  • 对不起,我的意思是转换成ASCII
  • 谢谢,但解决方案不起作用。你测试过吗?
  • 我认为您完全有能力理解意图,并纠正我可能犯的任何错误。无论如何,“不起作用”总是对问题的错误描述,不应在 SO 上使用。我看到我有一个&lt;= 指向错误的方向。我更正了。
  • 添加了多字节字符串函数版本。我不认为它更具可读性,但我相信它会执行得更快。
  • 谢谢。如果使用多字节函数可能会谨慎检查内部编码设置。当然,它应该是 UTF8。见:php.net/manual/en/function.mb-internal-encoding.php
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 2012-12-07
  • 1970-01-01
  • 2019-03-13
相关资源
最近更新 更多