theiconic / name-parser
PHP库,用于解析包含全名的字符串,将其分解为各个部分
Requires
- php: >=7.1
Requires (Dev)
- php-coveralls/php-coveralls: ^2.1
- php-mock/php-mock-phpunit: ^2.1
- phpunit/phpunit: ^7.0
- dev-master
- v1.2.11
- v1.2.10
- v1.2.9
- v1.2.8
- v1.2.7
- v1.2.6
- v1.2.5
- v1.2.4
- v1.2.3
- v1.2.2
- v1.2.1
- v1.2.0
- v1.1.0
- v1.0.3
- v1.0.2
- v1.0.1
- v1.0.0
- 0.1.1
- 0.1
- dev-feature/refactor-language-definitions
- dev-feature/string-functions
- dev-feature/lastname-remapping
- dev-feature/update-readme
- dev-feature/allow-salutation-at-end
- dev-feature/explicit-lastname-prefix-getter
- dev-feature/allow-nicknames-at-end
- dev-feature/languages
This package is auto-updated.
Last update: 2024-09-21 23:19:49 UTC
README
目的
这是一个通用、语言无关的名解析器。
它的目的是将包含全名的单个字符串(可能包括称呼、首字母、后缀等)分割成有意义的部分,如名、姓、首字母等。
它主要针对英文姓名,但只要使用拉丁字母拼写,也能很好地处理非英文姓名。
例如,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);
组合首字母是几个大写字母的组合,例如 DJ
或 J.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许可证下发布。