Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用于验证名称的正则表达式_Php_Regex - Fatal编程技术网

Php 用于验证名称的正则表达式

Php 用于验证名称的正则表达式,php,regex,Php,Regex,我想创建一个正则表达式来验证一个人的名字。应允许: 字母(大写和小写) - 空间 为其创建正则表达式非常容易。问题是有些人在名字中也使用特殊字符。例如,假设一个名为gānther或François的用户。有很多像ā和ç这样的角色可用,很难列出所有这些角色 有没有一种简单的方法来检查正确的人名 有没有一种简单的方法来检查正确的人名 这已经讨论过好几次了。我相当肯定,人们唯一能达成共识的是,为了存在,名称不能是空字符串,因此: ^.+$ (是的,我知道这可能不是OP想要的。我只是总结一下之前的

我想创建一个正则表达式来验证一个人的名字。应允许:

  • 字母(大写和小写)
  • -
  • 空间
为其创建正则表达式非常容易。问题是有些人在名字中也使用特殊字符。例如,假设一个名为gānther或François的用户。有很多像ā和ç这样的角色可用,很难列出所有这些角色

有没有一种简单的方法来检查正确的人名

有没有一种简单的方法来检查正确的人名

这已经讨论过好几次了。我相当肯定,人们唯一能达成共识的是,为了存在,名称不能是空字符串,因此:

^.+$

(是的,我知道这可能不是OP想要的。我只是总结一下之前的问答。)

/^\pL[\pL'-]*\z/
应该可以做到这一点

我不知道你到底想做什么(验证用户名输入?),但基本上我会保持简单-如果文本包含数字,则验证失败。即使这一点也可能相当不确定。

简单的答案是不,没有简单的方法。你提到了最大的问题。有太多的特殊情况的口音和额外的东西悬挂的信件,这将成为一个混乱的处理。另外,带有breakdown的表达式如下所示

^[CAPITAL_LETERS][ALL_LETERS_AND_SYMBOLS]*$

这并没有什么帮助,因为“Abcd”符合这一点,你无法知道是否有人在字段中输入了错误的信息,或者是否是好莱坞的疯狂家长给他们的孩子起了这个名字,或者是三明治或雨伞之类的名字。

我也有同样的问题。首先我想到了类似的东西

    preg_match("/^[a-zA-Z]{1,}([\s-]*[a-zA-Z\s\'-]*)$/", $name))
但后来意识到,UTF-8字符的国家,如瑞典,中国等,例如Õå将是不允许的,这对我的网站很重要,因为它是一个国际网站,不想强迫用户不能输入他们的真实姓名

我认为这可能是一个更简单的解决方案,而不是试图找出如何允许像O'Malley、Brooks Schneider和Õsmar这样的名字(虚构的:)来捕捉你不想让他们进入的角色。对我来说,这基本上是为了避免输入xss JS代码。所以我使用下面的正则表达式来过滤掉所有可能有害的字符

    preg_match("/[~!@#\$%\^&\*\(\)=\+\|\[\]\{\};\\:\",\.\<\>\?\/]+/", $name)
preg\u match(“/[~!@\$%\^&\*\(\)=\+\\\\[\]\\\\};\\:\”,\.\?\/]+/”,$name)
这样他们就可以输入任何他们想要的名字,除了实际上不属于任何名字的字符。希望这可能有用

^.+$
选中@jensgram answer,但regex只接受所有字符串,所以它不能解决问题,因为字符串需要是name,在这种情况下,它可以是任何东西

^[A-Z][a-z]+$

我的正则表达式只接受第一个字符为大写,后面的字符为小写字母的字符串。再看看其他答案,这似乎是最短的正则表达式,也是最简单的。

中文或西里尔文名称如何?您使用的是什么字符集?名称还可以包含引号,如“O'Neill”中的引号,例如。不允许使用中文或西里尔文名称。。。应该有一个限度。我不确定哪个字符集最适合使用……你可以使用这个问题的解决方案:为所有人名定义一个字符列表似乎超出了正则表达式的范围。从一个非编程POV提供一个真实姓名的激励?或者只排除不需要的字符。@Bv202,它要求字符串由一个或多个组成:
\pL
(unicode字母)、空格、撇号和连字符。以unicode字母开头。应该是公认的答案,而不是上面有点聪明的aleck。(尽管他的观点应该得到考虑。)@Paraluie IMO堆栈交换网络上不应该只接受代码的答案——这会鼓励糟糕的发布实践。
{1}
是无用的语法,可以安全地删除。同样,对于捕获组,@mickmackusa根据您的评论更新了答案。谢谢我的名字是Jean François,我该怎么办?这是非常糟糕/松散的验证。它将允许
42
^&*
>模式修饰符
i
将不需要在字符类中同时写入大写和小写字母
{1,}
简单地写为
+
。转义单引号是不必要的。cature组是不必要的。