到目前为止,我对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和正则表达式技能很小,这是我到目前为止所提出的全部内容。
编辑:可接受的名称是:
在阅读评论之后,我想我会放弃验证地址,如下所示:
除了姓名,我想验证地址和电话号码。地址除了字母外还可以有数字,而电话号码只能有数字。我想如果验证名称的问题得到解决,那么我也能够为地址和数字做到这一点。 击>
如果有人能让我朝着正确的方向前进,我将不胜感激。
PS:执行命名政策是对还是错是一个单独的争论。 * 免责声明:这个问题的答案并不意味着读者在他们的生产应用程序中使用相同的东西来验证名称。 *
答案 0 :(得分:3)
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
工作正则表达式示例:
注意:如果您想在名称中允许'
,例如O'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示例: