在RegEx中接受国际名称字符

时间:2011-11-04 18:10:47

标签: php regex

我一直在与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可以实现这个目标。就像我说的那样,我已经四处寻找,但这是我能做的最好的事情。

那么,检查大小写字符,逗号,句号,撇号,大肆,变音符号,拉丁语,日语/俄语等的好方法是什么

3 个答案:

答案 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-zA-Z,因此上述模式"/^[a-zA-Z\s,.'-\pL]+$/u"可简化为

"/^[\s,.'-\pL]+$/"

也不需要修饰符u

答案 2 :(得分:3)

通过允许其他类型的标点符号,可能会放松一些资格。

应该限制的一件事是要求至少一个字母。

if (!preg_match("/^[\s,.'-]*\p{L}[\p{L}\s,.'-]*$/u", $name))

相关问题