如何检查真实姓名和姓氏 - PHP

时间:2009-02-17 15:31:19

标签: php regex utf-8

这是我的问题: 我想检查用户是否通过检查他们是否只有字母(任何字母)和'或 - 在PHP中插入真实姓名和姓氏。 关于如何检查字符串是否只包含字母,我在这里找到了解决方案(但我不记得链接):

preg_match('/^[\p{L} ]+$/u',$name)

但我也愿意承认'和 - 也是。 (Charset是UTF8) 有人可以帮帮我吗?

7 个答案:

答案 0 :(得分:6)

有点偏离主题,但确切名称究竟是什么意思?

这不是为了防止欺诈;如果人们试图给你一个假名,他们可以很容易地输入一串随机字母。

这不是为了防止错误;输入标点字符只是你可以犯的许多错误中的一个,而且不太可能。

这不是为了防止代码注入;你应该通过正确编码输出来阻止它,无论它们包含什么字符。

那么为什么我们都这样做呢?

答案 1 :(得分:5)

看起来你只需要修改正则表达式:[\ p {L}' - ] +

答案 2 :(得分:5)

(国际)名称可以包含许多字符:空格,短划线,普通字母,变音符号,重音符号......

编辑:关键是:如何确保所有字母(所有语言),破折号和空格都足够?是否没有包含点的名称(“No博士”怎么样?),冒号或其他一些其他?

EDIT2 :感谢用户'某些'可能来自瑞典(留下评论),我们现在知道有一个瑞典名字'Andreas J:son Friberg'。记住结肠!

答案 3 :(得分:2)

根据您要允许的字符集,您只需要确保要支持的字符位于正则表达式的“[]”部分内。由于' - '字符在此上下文中具有特殊含义(它创建一个范围),因此它必须是列表中的最后一项。

\ p {L}表示匹配任何具有字母属性的字符。 \ w具有相似的含义,但也包含“_”字符,您可能不想要它。

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

会匹配最常见的名称,但如果你想支持外国字符集,你需要更多的异域正则表达式。

答案 4 :(得分:0)

这也应该这样做

/[\w'-]+/gi

答案 5 :(得分:0)

如果charset是UTF-8,那么你有问题 - 你如何检查中欧和东欧拉丁字符(变音符号)或西里尔文,中文或日文名称?这将是一个正则表达式的地狱。

答案 6 :(得分:0)

请注意,您提供的示例不会检查以确保用户同时具有姓氏和名称,但我认为这应该是这样的。你不应该假设一个人有多个名字。我目前正在开发一个PHP应用程序,它在上下文中处理人们的名字,如果我发现了什么,你就不能做出这样的假设:)甚至很多非名人只有一个名字。

使用\ p {L}中的Unicode类别是一个好主意,因为显然人们会在其名称中使用其他语言中的各种字符。然而,除了\ p {L}之外,您还必须考虑组合标记 - 即人们添加为额外字符的重音符号,变音符号等。

所以,也许在\ p {L}之后立即添加\ p {Mc}

我最终会

preg_match('/^[\pL\p{Mc} \'-]+$/u', $name)