theiconic/name-parser

PHP库,用于解析包含全名的字符串,将其分解为各个部分

v1.2.11 2019-11-14 14:08 UTC

README

Build Status Coverage Status Scrutinizer Code Quality Latest Stable Version Total Downloads License

目的

这是一个通用、语言无关的名解析器。

它的目的是将包含全名的单个字符串(可能包括称呼、首字母、后缀等)分割成有意义的部分,如名、姓、首字母等。

它主要针对英文姓名,但只要使用拉丁字母拼写,也能很好地处理非英文姓名。

例如,Mr Anthony R Von Fange III被解析为

  • 称呼:Mr.
  • 名:Anthony
  • 首字母:R
  • 姓:von Fange
  • 后缀:III

这个包已经被The Iconic在生产环境中使用了多年,成功处理了数十万客户的姓名。

功能

支持的格式

此解析器能够处理带逗号和不带逗号的名字格式

... [firstname] ... [lastname] ...
... [lastname] ..., ... [firstname] ...
... [lastname] ..., ... [firstname] ..., [suffix]

支持的组成部分

  • 称呼(例如Mr、Mrs、Dr等)
  • 中间名
  • 首字母(单个字母,可能后跟一个点)
  • 昵称(括号、方括号等内的部分)
  • 姓(也支持von、de等前缀)
  • 后缀(Jr、Senior、3rd、PhD等)

其他功能

  • 支持多种语言称呼、后缀和姓前缀
  • 可自定义昵称分隔符
  • 可自定义所有输出字符串的正常化(原始值仍然可访问)
  • 可自定义空白字符

示例

解析器单元测试中可以找到60多种不同的成功解析的名字格式。

设置

composer require theiconic/name-parser

用法

基本用法

<?php

$parser = new TheIconic\NameParser\Parser();

$name = $parser->parse($input);

echo $name->getSalutation();
echo $name->getFirstname();
echo $name->getLastname();
echo $name->getMiddlename();
echo $name->getNickname();
echo $name->getInitials();
echo $name->getSuffix();

print_r($name->getAll());

echo $name;

对于缺失的部分,返回一个空字符串。

特殊部分检索功能

显式姓部分

您可以使用以下方法分别检索姓前缀和纯姓

echo $name->getLastnamePrefix();
echo $name->getLastname(true); // true enables strict mode for pure lastnames, only

带有规范化包装的昵称

默认情况下,getNickname()返回昵称的纯字符串。但是,您可以将true传递以应用与echo $name相同的规范化括号包装

echo $name->getNickname(); // The Giant
echo $name->getNickname(true); // (The Giant)

按输入顺序重新打印名字

您可以通过getGivenName()重新打印组成名字的部分(即名、中间名和任何首字母),同时仍然通过应用规范化来按输入顺序打印它们

echo $name->getGivenName(); // J. Peter M.

重新打印全名(实际名字部分)

您可以通过getFullName()重新打印全名,即上述名字后跟任何姓部分(不包括任何称呼、昵称或后缀)

echo $name->getFullName(); // J. Peter M. Schluter

设置语言

$parser = new TheIconic\NameParser\Parser([
    new TheIconic\NameParser\Language\English(), //default
    new TheIconic\NameParser\Language\German(),
])

设置昵称分隔符

$parser = new TheIconic\NameParser\Parser();
$parser->setNicknameDelimiters(['(' => ')']);

设置空白字符

$parser = new TheIconic\NameParser\Parser();
$parser->setWhitespace("\t _.");

限制称呼的位置

$parser = new TheIconic\NameParser\Parser();
$parser->setMaxSalutationIndex(2);

这要求称呼出现在输入字符串的前两个单词中。默认为输入字符串中单词数量的一半,这意味着称呼可能出现在名字部分的前半部分。

调整组合首字母支持

$parser = new TheIconic\NameParser\Parser();
$parser->setMaxCombinedInitials(3);

组合首字母是几个大写字母的组合,例如 DJJ.T.,中间没有空格。解析器会将这样的(可选的点号)大写字母序列视为组合首字母,并将其解析为单独的首字母。此值调整单个姓名部分中可识别为组合首字母的最大大写字母数。超过指定最大字母数的部分将不会被解析为首字母,因此很可能会解析为名字或中间名。

默认值是2。

要禁用组合首字母支持,将此值设置为1;

提示

提供干净的输入字符串

如果您的输入字符串除了名字和直接相关的部分(如称呼、后缀等)外还包含其他内容,任何额外的部分都可能很容易混淆解析器。因此,建议在传递给解析器之前预先处理任何非干净输入以隔离名字。

多遍解析

我们还没有尝试过这个,但您可能可以通过连续进行多次解析来提高结果。例如。

$parser = new Parser();
$name = $parser->parse($input);
$name = $parser->parse((string) $name);
...

您甚至可以从前一次遍历的各个部分组成新的输入字符串。

处理不同语言的名字

该解析器主要围绕英语名字的模式构建,但试图与其他语言的名字兼容。在称呼、姓氏前缀、后缀等问题上或在某些情况下甚至解析顺序上可能出现问题。

为了解决称呼、姓氏前缀和后缀的问题,您可以创建一个单独的语言定义文件,并在实例化解析器时注入它,参见上面的“设置语言”并比较现有的语言文件作为示例。

为了处理解析顺序,您可能需要重新格式化输入字符串,例如简单地将其拆分为单词并反转它们的顺序。您甚至可以同时让解析器在原始字符串和反转字符串上运行,然后从两个结果名字对象中选择最佳结果。例如,一个是从一个中提取称呼,另一个是从另一个中提取姓氏。

名字解析器没有内置的语言检测功能。然而,您可能已经在同一表格中询问了用户的国籍。如果您这样做,您可能希望将传递给解析器的语言定义文件缩小到指定的语言,以及可能的后备语言,如英语。您还可以使用此信息准备输入字符串,如上所述。

或者,Patrick Schur提供了一个PHP语言检测库,似乎能提供惊人的结果。如果只在名字输入字符串上运行它,可能不会给您带来太多运气,但如果您有来自该人的更多文本,您可以使用此来检测语言,然后按照上述方法进行。

性别检测

性别检测不在此项目的范围内。从名字中检测性别通常需要大量名字到性别的映射列表。

然而,您可以使用此解析器从输入字符串中提取称呼、名字和昵称,然后使用这些信息通过另一个包(例如这个)或服务来实现性别检测。

在正常化中找到乐趣

编写不同的语言文件不仅可以用于解析,还可以将称呼、前缀和后缀的正常化版本重新映射为完全不同的内容。

例如,您可以将 Ms. 映射到 王国的公主 并将部分以适当的顺序输出,以构建一个自动将例如 Ms. Louisa Lichtenstein 转换为 Louisa,王国的公主Lichtenstein 的管道。当然,这是一个愚蠢且相当牵强的例子,但您已经明白了。

当然,这也可用于更有用的方式,例如展开缩写标题,如Prof.代表教授等。

许可证

THE ICONIC 命名解析库(用于PHP)在MIT许可证下发布。