PHP实现仅允许带重音拉丁人名、禁止中俄字符的方案问询
PHP拉丁系人名验证方案
直接上可行的正则方案,完美支持所有拉丁系字符(含捷克、冰岛等地区的特殊重音字符),同时拦截中文、俄文等非拉丁字符:
// 匹配仅含拉丁字母、空格、撇号、连字符、点号的人名,u修饰符确保UTF-8解析 $namePattern = '/^[\p{Latin} \'.-]+$/u'; if (preg_match($namePattern, $values['person_name'])) { // 人名验证通过 } else { // 包含非拉丁字符或非法符号,验证失败 }
为什么之前的方案都不行?
- strlen/mb_strlen对比法:只能检测字节数≠字符数的多字节字符,但像捷克语的
š这类拉丁特殊字符本身就是多字节UTF-8,会被误判为非拉丁字符,导致冰岛、捷克人名验证失败。 - 之前的正则问题:
- 用
\p{L}会匹配所有Unicode字母(包括中文、俄文),自然放行非拉丁字符; - 手动写
À-ÿ这类字符范围,覆盖不全所有拉丁系特殊字符(比如š、ň不在这个区间里); - 部分正则没加
u修饰符,没法正确解析UTF-8编码的特殊字符。
- 用
测试验证
- 能通过的合法人名:
Eliška Koňaříková、Ólafur Ragnar Grímsson、Jean-Luc Picard、O'Conner - 会被拦截的非法内容:
张三、Иван、書
可选扩展
如果要限制人名长度(比如至少2个字符),可以修改正则:
$namePattern = '/^[\p{Latin} \'.-]{2,}$/u';
内容的提问来源于stack exchange,提问作者CopperRabbit
相关产品推荐
相关产品推荐

