我一直在与RegEx挣扎,所以请原谅我,如果这对解决我的问题似乎是一种糟糕的方法。
当用户输入名字和姓氏时,我开始使用基本名称,检查大写和小写,空格,撇号和连字符
if (!preg_match("/^[a-zA-Z\s'-]+$/", $name)) { // Error }
现在我意识到这不是最好的,因为人们可以拥有如下的东西:马丁路德金博士(用逗号和全文)。所以我认为通过改变它会使它更有效。
if (!preg_match("/^[a-zA-Z\s,.'-]+$/", $name)) { // Error }
然后我在Facebook上看到了一个我知道的女孩名字,她把自己的名字写成了Siân,这让我想到了包含变音符号以及日语/中文/韩语/俄语字符的名字。所以我开始搜索并通过在其中写下每个字符来找到方法。
if (!preg_match("/^[a-zA-Z\sàáâäãåèéêëìíîïòóôöõøùúûüÿýñçčšžÀÁÂÄÃÅÈÉÊËÌÍÎÏÒÓÔÖÕØÙÚÛÜŸÝÑßÇŒÆČŠŽ∂ð ,.'-]+$/u", $first_name)) { // Error }
你可以想象,这是一个非常长的啰嗦,我很确定有一个更简单的RegEx可以实现这个目标。就像我说的那样,我已经四处寻找,但这是我能做的最好的事情。
那么,检查大小写字符,逗号,句号,撇号,大肆,变音符号,拉丁语,日语/俄语等的好方法是什么
答案 0 :(得分:30)
您可以使用Unicode字符类。 \pL
几乎涵盖了所有字母符号
http://php.net/manual/en/regexp.reference.unicode.php
if (!preg_match("/^[a-zA-Z\s,.'-\pL]+$/u", $name))
另请参阅http://www.regular-expressions.info/unicode.html,但要注意PHP / PCRE只能理解缩写的类名。
答案 1 :(得分:7)
\pL
已包含a-z
和A-Z
,因此上述模式"/^[a-zA-Z\s,.'-\pL]+$/u"
可简化为
"/^[\s,.'-\pL]+$/"
也不需要修饰符u
。
答案 2 :(得分:3)
通过允许其他类型的标点符号,可能会放松一些资格。
应该限制的一件事是要求至少一个字母。
if (!preg_match("/^[\s,.'-]*\p{L}[\p{L}\s,.'-]*$/u", $name))