Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 接受正则表达式中的国际名称字符_Php_Regex - Fatal编程技术网

Php 接受正则表达式中的国际名称字符

Php 接受正则表达式中的国际名称字符,php,regex,Php,Regex,我一直在与正则表达式斗争,所以请原谅我,如果这似乎是一个可怕的方法来解决我的问题 当用户输入名字和姓氏时,我一开始只是使用basic,检查大小写、空格、撇号和连字符 if (!preg_match("/^[a-zA-Z\s'-]+$/", $name)) { // Error } 现在我意识到这不是最好的,因为人们可能会有这样的东西:马丁·路德·金博士(带逗号和句号)。所以我假设把它改成这个会使它稍微更有效一些 if (!preg_match("/^[a-zA-Z\s,.'-]+$/", $n

我一直在与正则表达式斗争,所以请原谅我,如果这似乎是一个可怕的方法来解决我的问题

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

if (!preg_match("/^[a-zA-Z\s'-]+$/", $name)) { // Error }
现在我意识到这不是最好的,因为人们可能会有这样的东西:马丁·路德·金博士(带逗号和句号)。所以我假设把它改成这个会使它稍微更有效一些

if (!preg_match("/^[a-zA-Z\s,.'-]+$/", $name)) { // Error }
然后我在我的Facebook上看到了一个我认识的女孩的名字,她写的名字是Si–n,这让我想到了包含UMLAUT的名字,以及日语/汉语/韩语/俄语字符。所以我开始搜索,并找到了方法,把每个字符都写在里面,就像这样

if (!preg_match("/^[a-zA-Z\sàáâäãåèéêëìíîïòóôöõøùúûüÿýñçčšžÀÁÂÄÃÅÈÉÊËÌÍÎÏÒÓÔÖÕØÙÚÛÜŸÝÑßÇŒÆČŠŽ∂ð ,.'-]+$/u", $first_name)) { // Error }
正如你可以想象的,这是非常冗长的,我非常确定有一个更简单的正则表达式可以实现这一点。就像我说的,我到处找过,但这是我能做的最好的了


那么,检查大小写字符、逗号、句号、撇号、hypens、umlauts、拉丁语、日语/俄语等的好方法是什么呢?您可以使用Unicode字符类
\pL
涵盖了几乎所有的字母符号。


另请参见,但请注意,PHP/PCRE只理解缩写的类名。

允许使用其他类型的标点符号可能会使限定条件有所放宽

应该限制的一件事是至少需要一封信


如果(!preg\u match(“/^[\s,.-]*\p{L}[\p{L}\s,.-]*$/u“,$name))
\pL
已经包括
a-z
a-z
,因此所提到的模式
“/^[a-zA-z,.-]+/u”
可以简化为

“/^[\s,.-\pL]+$/”


另外,不需要修饰符
u

啊,非常感谢,为什么我不能早点找到这个,哈!你能告诉我缩写的类名是什么意思吗?@HelloJoe:这不是最明显的特征。只是很晚才在PHP手册中找到文档。缩写词:PCRE仅支持
\p{L}
而不支持
\p{Letter}
\p{Russian}
例如。您的
,.
在其中,您可能想删除它,因为它是一个名称。很好,谢谢。但表达式包含一个小错误,请更正:
/^[a-zA-Z\s,.\-\pL]+$/u
/^[a-Z\s,.-\pL]+$/iu
它不包含除非先进行规范化否则将不起作用的æå或ß,而且通常在那时也不起作用。尽管我最初打算使用+1,因为提到
a-zA-Z
是多余的,我必须提到,
u
修饰符肯定是必需的,否则PHP不支持多字节编码。我在我的开发机器上测试了它,它在没有
u
修饰符的情况下为我工作。您是否使用UTF-8或其他多字节编码,或单字节编码,如ASCII或拉丁语?单字节编码不需要
u
修饰符。
 if (!preg_match("/^[a-zA-Z\s,.'-\pL]+$/u", $name))