为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 PHP 中验证多语言名称?

如何在 PHP 中验证多语言名称?

PHP
噜噜哒 2023-09-15 17:28:43
我正在使用 PHP 构建一个全球网站,我希望用户能够用自己的语言输入他们的名字和姓氏,而不仅仅是英语,例如:印度人将能够用印度字母输入他们的名字,俄罗斯人将能够输入他们的名字能够用俄语字母输入他们的名字,等等。现在,我允许名字和姓氏仅包含字母。所以我的问题是我应该如何验证名称?我的意思是:我应该如何检查这些名称是否仅由字母组成?如果我只有英文名字,它会是这样的:preg_match('/[^A-Za-z]/', $fname.$lname),但现在我不仅有英文字母。注意:我无法为每种不同的语言及其字母一次又一次地编写此验证公式。感谢您到目前为止阅读这个问题。有任何想法吗??
查看完整描述

1 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

如果您想使用正则表达式来验证名称,则必须使用修饰符打开 Unicode 模式/u。当处于 Unicode 模式时,PCRE 字符类不仅匹配 ASCII 字母,还包括任何语言和脚本中的字母字符。假设您使用了该类[:alpha:],或者在启用 Unicode 的情况下\p{L}该类[:alpha:]扩展为:

$fname = 'हिन्दी';
$lname = 'Русский';
preg_match('/[^[:alpha:]]/u', $fname.$lname));

这里“Russkiy”按预期验证,但“Hindi”失败。但为什么?印地语是一种附标文字,例如元音变音符号和固有元音静音符作为其结构的一部分。人们可能会假设"ि","्""ी"以上注册为字母;然而他们没有。它们属于不同的类、\p{M}或与其他字符组合的字符。然后,为了匹配 abugida-alphabet 语言(例如印度文字,包括缅甸、泰语、藏语等),我们应该使用:

preg_match('/([^\p{L}\p{M}])/u', $fname.$lname));

我已初步验证此组合与以下语言中预期的字母和组合标记字符匹配:阿卡德语、阿拉伯语、亚美尼亚语、希腊语、古吉拉特语、希伯来语、印地语、日语、马拉雅拉姆语、普通话、俄语、僧伽罗语、苏美尔语、泰米尔语、泰语。更详尽的测试尚未完成,可以肯定地说,上面的内容将涵盖您的大部分字母基础。

现在,关于验证名称的完全与 unicode 无关的问题。我注意到您不允许名称中包含空格。害怕“亚伯拉罕·范海辛”“奥萨马·本·拉登”尝试报名的那一天。然后,你不允许经期。那“VS Achuthanandan”呢,人们叫他“Vee Es”,因为“Velikkakathu Sankaran”让你的嘴很累。那么“JK罗琳”呢?

再次强调,不允许使用破折号。“卡里姆·阿卜杜勒-贾巴尔”“让-吕克·皮卡德”怎么样?没有适合您的职业篮球或曲速驱动器。再次强调,不允许使用撇号意味着“达达尼昂伯爵”可能会向你发起决斗挑战,而未来可能属于天网,因为“莎拉·奥康纳”未能注册。她不会回来了。你的网站不太酷。

又名老式鲍比桌(Bobby Tables)怎么样?Robert'); DROP TABLE students;--,或者埃隆·马斯克的新生儿“X Æ A-12”。在那里,我已经告诉您如何匹配任何语言中的任何字母或其片段。我还暗示,如果您允许上述所有内容,几乎是避免误报的基线,那么它可能与一开始就不进行检查没有太大区别。给出“x!1യ!!O'/nul1 W0W@本@?” 他/她有使用奇怪名字的自由,如果那是他们真正想要的。


查看完整回答
反对 回复 2023-09-15
  • 1 回答
  • 0 关注
  • 67 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信