【问题标题】:Validating customer names, address and phone验证客户姓名、地址和电话
【发布时间】:2014-01-16 21:23:38
【问题描述】:

到目前为止,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. 名字第二个第三个第四个第五个
  3. 名称可以不区分大小写。

看完cmets后,我想我会放弃验证地址,所以在下面的段落中删除了。

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

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

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

【问题讨论】:

  • 我不会,请参阅this。地址也是如此。但是,您可能会做出足够好的表达来验证电话号码(但我会保持宽容)。
  • O'Brien 怎么样?带有重音符号或非 ASCII 字符的名称呢?基本上,您应该接受名称可能不符合特定标准的事实。
  • 谁是反对者,为什么? @SamSullivan 看着链接我知道我们永远不应该验证名字?那么我该如何称呼一个名字为 --- 或 ''' 的人呢?您好先生三重单引号?
  • @sttaq 所以你最好用简单的语言定义你认为可以接受的条目作为起点。
  • @Sam 我明白你的意思,有效的名称政策并不重要。我想学习如何制作这样的正则表达式。该政策由雇主口述,由我自己执行。我只能提出你的建议。我不能争辩。我必须按照他们想要的方式实施。

标签: php regex validation prestashop-1.5


【解决方案1】:
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

注意:如果您想在名称中允许',例如O'Brien 或任何其他字符,您可以将它们添加到字符集中。即-([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

【讨论】:

  • Matt J. Smith Ronald O'Brien José Enrique FirstName MaidenName MarriedName
  • 谢谢,稍微修改一下你的正则表达式可以满足多个名称的大小写,但不能满足特殊字符 ^[A-Za-z]+(\s[A-Za-z]+)+$
  • @SamSullivan 是的,我知道许多其他名称的可能性,但是我完全按照 OP 的要求回答了这个问题。 - “我想要做的就是允许像“FirstName MiddleName”这样的名称一次只有一个空格字符,而不是在名称的开头。”
  • 谢谢,我刚刚完成了对您的正则表达式的另一个调整版本的测试,该版本有效。我也会尝试答案中的那个。我用了这个 preg_match('/^[A-Za-z]+(\s?[A-Za-z]+)*$/', $name);这显然不是为了匹配点和引号
  • 足够公平的@MElliott,已删除反对票。是的,正则表达式 101 超过正则表达式 +1。
猜你喜欢
  • 2020-04-26
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多