1 回答
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@本@?” 他/她有使用奇怪名字的自由,如果那是他们真正想要的。
- 1 回答
- 0 关注
- 95 浏览
添加回答
举报