10

我正在使用 PHP 验证我的联系表单,并且我使用了以下代码:

if (ctype_alpha($name) === false) {
            $errors[] = 'Name must only contain letters!';
}

此代码工作正常,但它过度验证并且不允许空格。我已经尝试过ctype_alpha_s,但出现了一个致命错误。

任何帮助将不胜感激

4

4 回答 4

30

正则表达式是多余的,对于这样一个简单的任务会执行得更糟,考虑使用本机字符串函数:

if (ctype_alpha(str_replace(' ', '', $name)) === false) {
  $errors[] = 'Name must contain letters and spaces only';
}

这将在运行 alpha 检查之前去除空格。如果制表符和新行是一个问题,您可以考虑使用它:

str_replace(array("\n", "\t", ' '), '', $name);
于 2013-03-11T18:54:45.323 回答
11

ctype_alpha 只检查字母 [A-Za-z]

如果您想将它用于您的目的,首先您必须从字符串中删除空格,然后应用 ctype_alpha。

但我会去 preg_match 检查验证。你可以做这样的事情。

if ( !preg_match ("/^[a-zA-Z\s]+$/",$name)) {
   $errors[] = "Name must only contain letters!";
} 
于 2013-03-11T19:00:49.163 回答
4

一个用于 UTF-8 世界,将匹配来自任何语言的空格和字母。

if (!preg_match('/^[\p{L} ]+$/u', $name)){
  $errors[] = 'Name must contain letters and spaces only!';
}

解释:

  • [] => 字符类定义
  • p{L} => 匹配来自任何语言的任何类型的字母字符
  • p{L} => 后的空格匹配空格
  • + => 量词——匹配一次到无限次(贪心)
  • /u => Unicode 修饰符。模式字符串被视为 UTF-16。还会导致转义序列匹配 unicode 字符

这也将与上面 Anthony Hatzopoulos 的评论中提到的Björk Guðmundsdóttir等名称匹配。

于 2017-09-26T00:28:56.520 回答
1
if (ctype_alpha(str_replace(' ', '', $name)) === false)  {
  $errors[] = 'Name must contain letters and spaces only';
}
于 2016-06-06T10:56:33.810 回答