1

到目前为止,Prestashop 提供的开箱即用功能给我留下了深刻的印象,但这件事真的让我失望:如果有人想在网站上注册或做访客结账,他可以把任何东西作为他的名字。任何内容都包括“---”、所有空格、“ * ”等。这里没有提供验证,这真的很烦人。

我试图修改 website\controllers\front\AuthController.php 中的 processSubmitAccount 方法以使用 Validate::isName() 方法,但这根本没有帮助。它允许用户将所有奇怪的字符放在名称字段中。我试图在 Validate 类中创建另一个方法:

public static function isHumanName($name)
{    
 return preg_match('/^[A-Za-z]+$/', $name);
}

但由于某种原因,这种简单的模式不起作用。我想要做的就是允许像“FirstName MiddleName”这样的名称一次只有一个空格字符,而不是在名称的开头。我的 php 和 regex 技能很少,这就是我迄今为止想出的全部。

编辑:可接受的名称是:

  1. 名字 第二 第三 第四 第五
  2. 名称可以不区分大小写。

阅读评论后,我想我会放弃验证地址,所以在下面的段落中删除。

除了姓名之外,我还想验证地址和电话号码。地址除了字母之外还可以有数字,而电话号码只能有数字。我想如果验证名称的问题得到解决,那么我也可以对地址和数字进行验证。

如果有人能把我引向正确的方向,我将不胜感激。

PS:执行命名政策是对还是错是一个单独的辩论。 *免责声明:这个问题的答案并不意味着读者在他们的生产应用程序中使用相同的东西来验证名称。*

4

1 回答 1

4
preg_match('/^[A-Za-z]+\s[A-Za-z]+$/', $name);

将匹配:

FirstName MiddleName

示例:http ://regex101.com/r/lE5gW4

编辑:

好的,这更符合 OP 的要求。

正则表达式:

^([A-Z][A-Za-z]+) (?:([A-Z][A-Za-z.]+) )?([A-Z][A-Za-z]+)$

这匹配以下变体..

FirstName M. LastName
FirstName LastName
FirstName MiddleName Lastname

工作正则表达式示例:

http://regex101.com/r/nG1vN5

注意:如果您想允许'在名称中使用 inO'Brien或任何其他字符,您可以将它们添加到字符集中。IE-([A-Z][A-Za-z.']+)

php示例:

$name = "FirstName M. LastName";

$truefalse = preg_match('/^([A-Z][A-Za-z]+) (?:([A-Z][A-Za-z.]+) )?([A-Z][A-Za-z]+)$/', $name);

echo $truefalse;

输出:

1

工作 php 示例:

https://eval.in/90720

于 2014-01-16T21:27:32.840 回答