我正在使用PHP验证我的联系人表单,我使用了以下代码:
if (ctype_alpha($name) === false) {
$errors[] = 'Name must only contain letters!';
}
这段代码工作得很好,但是它过度验证并且不允许空格。我试过ctype_alpha_s
,出现了一个致命的错误。
如有任何帮助,不胜感激
Regex是多余的,对于这样一个简单的任务会表现得更差,考虑使用本地字符串函数:
if (ctype_alpha(str_replace(' ', '', $name)) === false) {
$errors[] = 'Name must contain letters and spaces only';
}
这将在运行alpha检查之前删除空格。如果制表符和换行是一个问题,你可以考虑使用这个:
str_replace(array("'n", "'t", ' '), '', $name);
ctype_alpha只检查字母[A-Za-z]
如果你想使用它,首先你必须从你的字符串中删除空格,然后应用ctype_alpha。
但是我会使用preg_match来检查验证。你可以这样做。
if ( !preg_match ("/^[a-zA-Z's]+$/",$name)) {
$errors[] = "Name must only contain letters!";
}
一个用于匹配任何语言的空格和字母的UTF-8世界。
if (!preg_match('/^['p{L} ]+$/u', $name)){
$errors[] = 'Name must contain letters and spaces only!';
}
解释:
- [] =>字符类定义
- p{L} =>匹配任何语言中的任何类型的字母字符
- p{L} =>后面的空格匹配
- + =>量词-匹配1到无限次(贪)
- /u => Unicode修饰符。模式字符串被视为UTF-16。也导致转义序列匹配unicode字符
这也将匹配像Björk Guðmundsdóttir这样的名字,正如Anthony Hatzopoulos在上面的评论中所指出的。
if (ctype_alpha(str_replace(' ', '', $name)) === false) {
$errors[] = 'Name must contain letters and spaces only';
}