【问题标题】:Last name validation in phpphp中的姓氏验证
【发布时间】:2014-02-01 23:18:08
【问题描述】:

我的目标是通过允许姓氏仅包含字母或单引号来验证姓氏。 我不知道最快的方法是什么..也许是正则表达式我想.. 无论如何,到目前为止我有这个:

function check_surname($surname)
{
    $c = str_split($surname,1);
    $i = 0;
    $test = 1; // Wrong surname

    while($i < strlen($surname))
    {
       if(ctype_alpha($c[$i]) or $c[$i] == '\'')
       {
           $test = 0;
           $i++;
       }
       else
       {
           return false;
       }
    }
}

我能感觉到这里出了点问题,但我看不出它在哪里。 谁能帮帮我?

【问题讨论】:

  • 我不推荐this..如果您出于某种原因仍然需要return preg_match('/[a-z']/i', $surname);
  • “我的目标是通过允许姓氏仅包含字母或单引号来验证姓氏。” en.wikipedia.org/wiki/John_von_Neumann 打破这个...
  • @SamSullivan,这对 John le Carré 有用吗?
  • 是的。好文章,@SamSullivan。我以前在自己的博客上链接过它。问题是,如果 OP 确实想将其限制为包含字母的名称,é 是一个字母,它不会被 [a-z] 捕获。
  • 永远不要忘记变音符号,否则会疏远大量用户

标签: php regex validation


【解决方案1】:

cmets 中有一些很好的建议,我绝对同意@Cyclone 的观点,即您应该考虑变音符号(重音字母)。

幸运的是,PHP 正则表达式支持 Unicode 类,所以这很容易做到。 Unicode 包括一个类L 用于任何字母(大写、小写、修改和标题大小写)。这将允许名称中包含重音字母。

我还建议您允许使用破折号 (Katherine Zeta-Jones) 和空格 (Guido van Rossum)。鉴于这一切,我将使用以下正则表达式:

preg_match("/^[\p{L} '-]+$/", lname);

【讨论】:

  • 非常感谢大家!
  • 除非您启用 Unicode 模式并接受 --' -- 作为一个好名字...
  • 是的,它工作得很好!我将更新我对正则表达式的贫乏知识,并考虑您所有宝贵的建议。暂时我将使用您的解决方案!非常感谢
  • Walter,无论您是否启用 Unicode,它都会起作用。如果输入字符串不是 Unicode,则 PHP 的正则表达式引擎会将\p{L} 本质上视为[a-zA-Z]。至于像--'-- 这样的病态病例,在验证方面存在too之类的东西。很大程度上取决于您要阻止什么。如果您只是想通常防止错误,这可能没问题。如果你有混蛋用户想要尝试“--'--”之类的东西,那么,也许你需要一些更强大的东西,在这种情况下,我会使用多个正则表达式,也许还有一些启发式方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
  • 2013-11-04
  • 1970-01-01
  • 2016-08-18
  • 2021-09-08
  • 1970-01-01
  • 2011-12-28
相关资源
最近更新 更多