在RegEx中接受国际名称字符

no.*_*no. 9 php regex

我一直在与RegEx挣扎,所以请原谅我,如果这看起来像是一个解决我的问题的可怕方法.

当用户输入名字和姓氏时,我开始只使用基本,检查大小写,空格,撇号和连字符

if (!preg_match("/^[a-zA-Z\s'-]+$/", $name)) { // Error }
Run Code Online (Sandbox Code Playgroud)

现在我意识到这不是最好的,因为人们可以拥有如下的东西:马丁路德金博士(用逗号和全文).所以我认为通过改变它会使它更有效.

if (!preg_match("/^[a-zA-Z\s,.'-]+$/", $name)) { // Error }
Run Code Online (Sandbox Code Playgroud)

然后我在Facebook上看到了一个我知道的女孩名字,她把自己的名字写成了Siân,这让我想到了包含变音符号以及日语/中文/韩语/俄语字符的名字.所以我开始搜索并通过在其中写下每个字符来找到方法.

if (!preg_match("/^[a-zA-Z\sàáâäãåèéêëìíîïòóôöõøùúûüÿýñç?šžÀÁÂÄÃÅÈÉÊËÌÍÎÏÒÓÔÖÕØÙÚÛÜŸÝÑßÇŒÆ?ŠŽ?ð ,.'-]+$/u", $first_name)) { // Error }
Run Code Online (Sandbox Code Playgroud)

你可以想象,这是一个非常长的啰嗦,我很确定有一个更简单的RegEx可以实现这一目标.就像我说的那样,我已经四处寻找,但这是我能做的最好的事情.

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

mar*_*rio 30

您可以使用Unicode字符类.\pL几乎涵盖所有字母符号.
http://php.net/manual/en/regexp.reference.unicode.php

 if (!preg_match("/^[a-zA-Z\s,.'-\pL]+$/u", $name))
Run Code Online (Sandbox Code Playgroud)

另请参见http://www.regular-expressions.info/unicode.html,但要注意PHP/PCRE只能理解缩写的类名.

  • 完美,谢谢.但是表达式包含一个小错误,正确的一个:`/ ^ [a-zA-Z\s,.'\ - \pL] + $/u`或`/^ [az\s,.'-\pL] + $/iu` (2认同)

sta*_*abm 7

\pL已经包括a-zA-Z,因此所提到的图案"/^[a-zA-Z\s,.'-\pL]+$/u"可以简化为

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

u也不需要修饰符.

  • 虽然由于提到`a-zA-Z`是多余的,我最初打算+1,但我必须提到`u`修饰符当然是必需的,否则PHP不支持多字节编码. (4认同)