php中的姓氏验证

php中的姓氏验证,php,regex,validation,Php,Regex,Validation,我的目标是通过允许姓氏只包含字母或单个引号来验证姓氏。 我不知道最快的方法是什么我想可能是正则表达式。。 无论如何,到目前为止,我有以下几点: function check_surname($surname) { $c = str_split($surname,1); $i = 0; $test = 1; // Wrong surname while($i < strlen($surname)) { if(ctype_alpha($c

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

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;
       }
    }
}
函数检查\u姓氏($姓氏)
{
$c=str_split($姓氏,1);
$i=0;
$test=1;//姓氏错误
而($i
我能感觉到这里有点不对劲,但我看不出它在哪里。
有人能帮我吗?

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

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

我还建议您考虑破折号(凯瑟琳·泽塔·琼斯)和空格(圭多·范·罗森)。考虑到所有这些,我将使用以下正则表达式:

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

我不推荐..如果出于某种原因您仍然需要:
返回preg_match('/[a-z']/I',$name)“我的目标是通过允许姓氏只包含字母或单个引号来验证姓氏。”打破这个…@SamSullivan,这对John le Carré有用吗?是的。好文章,@SamSullivan。我以前在自己的博客上链接过它。问题是,如果OP确实想将其限制为包含字母的名称,那么é是一个字母,它不会被
[a-z]
捕获。永远不要忘记发音符号,否则你会疏远大量用户谢谢!除非启用Unicode模式并接受--“作为一个好名字…是的,它工作得很好!”!我要刷新我对ReGEX的不良知识,考虑你所有宝贵的建议。目前我将使用你的解决方案!非常感谢。不管您是否启用Unicode,它都会起作用。如果输入字符串不是Unicode,PHP的正则表达式引擎基本上将
\p{L}
视为
[a-zA-Z]
。至于像
-->这样的病理病例--
,有一件事就是验证太过分了。这在很大程度上取决于你想阻止什么。如果你只是试图防止犯错误,这可能是好的。如果你有一些混蛋用户想要尝试像“---”之类的东西,那么,也许你需要一些更强大的东西,在这种情况下,我会使用多个正则表达式,或者在上面使用一些启发式方法