加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 只匹配相同语言的字符集(如facebook名称)?

发布时间:2020-12-13 13:15:39 所属栏目:PHP教程 来源:网络整理
导读:preg_match(???,'firstname lastname') // true;preg_match(???,'?? ??') // true;preg_match(???,'?? lastname') // false;preg_match(???,'#$@ #$$#') // false; 目前我使用: '/^([一-龠0-9s]+|[ぁ-?0-9s]+|[?-?0-9s]+|[ァ-ヴー0-9s]+|[a-zA-Z0-9s]+
preg_match(???,'firstname lastname') // true;
preg_match(???,'?? ??') // true;
preg_match(???,'?? lastname') // false;
preg_match(???,'#$@ #$$#') // false;

目前我使用:

'/^([一-龠0-9s]+|[ぁ-?0-9s]+|[?-?0-9s]+|[ァ-ヴー0-9s]+|[a-zA-Z0-9s]+|[々〆〤0-9s]+)$/u'

但它只适用于某些语言.

您需要一个仅匹配来自同一个 unicode script(和空格)的字符的表达式,如:
^([p{SomeScript} ]+|[p{SomeOtherScript} ]+|...)$

您可以从脚本列表动态构建此表达式:

$scripts = "Hangul Hiragana Han Latin Cyrillic"; // feel free to add more

$re = [];
foreach(explode(' ',$scripts) as $s)
    $re [] = sprintf('[p{%s} ]+',$s);
$re = "~^(" . implode("|",$re) . ")$~u";

print preg_match($re,'firstname lastname'); // 1
print preg_match($re,'?? ??'); // 1
print preg_match($re,'?? lastname'); // 0
print preg_match($re,'#$@ #$$#'); // 0

但请注意,名称(至少在我熟悉的欧洲脚本中)通常包含属于“常用”脚本而不是特定语言的字符,如点,破折号和撇号.考虑到这些,上述表达式中的“块”的一个更逼真的版本可能是这样的:

((p{SomeScript}+(. ?|[ '-]))*p{SomeScript}+)

这将至少正确验证L.A.Léonde Saint-Just.

一般来说,验证人的姓名是一个复杂的问题,无法以100%的准确度解决.请参阅this funny post及其中的评论,以获取详细信息和示例.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读