首页 > 解决方案 > 在 PHP 中使用正则表达式来验证名称

问题描述

在这里,我想验证一个名称:

名称仅由这些字符 [a-zA-Z-'\s] 组成,但是不能存在由两个或多个连字符或撇号组成的序列,名称也应以字母开头。

我试过了

$name = preg_match("/^[a-zA-Z][a-zA-Z'\s-]{1,20}$/", $name);

但是它允许使用双连字符和撇号。如果可以帮忙谢谢

标签: phpregex

解决方案


您可以通过使用否定前瞻来使包含两个或多个连字符和撇号字符序列的名称无效:

(?!.*['-]{2})

例如

$names = array('Mike Cannon-Brookes', "Bill O'Hara-Jones", "Jane O'-Reilly", "Mary Smythe-'Fawkes");
foreach ($names as $name) {
    $name_valid = preg_match("/^(?!.*['-]{2})[a-zA-Z][a-zA-Z'\s-]{1,20}$/", $name);
    echo "$name is " . (($name_valid) ? "valid" : "not valid") . "\n";
}

输出:

Mike Cannon-Brookes is valid
Bill O'Hara-Jones is valid
Jane O'-Reilly is not valid
Mary Smythe-'Fawkes is not valid

3v4l.org 上的演示


推荐阅读