这是我的问题: 我想检查用户是否通过检查他们是否只有字母(任何字母)和'或 - 在PHP中插入真实姓名和姓氏。 关于如何检查字符串是否只包含字母,我在这里找到了解决方案(但我不记得链接):
preg_match('/^[\p{L} ]+$/u',$name)
但我也愿意承认'和 - 也是。 (Charset是UTF8) 有人可以帮帮我吗?
答案 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)