adci/full-name-parser

解析人名

0.2.4 2019-11-05 05:32 UTC

This package is auto-updated.

Last update: 2024-09-05 15:28:50 UTC


README

Latest Stable Version License Build Status Test Coverage Maintainability

描述

FullNameParser设计用于解析大量格式不一致的全名,例如来自数据库,即使遇到一些无法解析的垃圾条目也能继续处理而不会出错。

FullNameParser::parse()

  1. 接受一个包含人名的字符串,格式不限,
  2. 分析和尝试检测该姓名的格式,
  3. (如果可能)将姓名解析为其组成部分,
  4. (默认情况下)返回一个包含姓名所有单独部分的对象
    • title (字符串):头衔(例如 "Ms." 或 "Dr.")
    • first (字符串):名字或首字母
    • middle (字符串):中间名(或首字母)
    • last (字符串):姓氏或首字母
    • nick (字符串):昵称
    • suffix (字符串):后缀(例如 "Jr."、"II" 或 "Esq.")
    • error (字符串数组):任何解析错误消息

可选地,FullNameParser还可以

  • 返回姓名的指定部分作为字符串(或错误数组)
  • 始终修复或忽略返回部分的字母大小写(默认是仅在原始输入全为大写或全为小写时修复大小写)
  • 在错误时停止(默认是在输出中返回警告消息,但永远不会抛出PHP错误,无论输入有多混乱)

现在FullNameParser不能

  • 检测更多姓名前缀、后缀和头衔的变化(默认检测29个前缀、19个后缀、16个头衔和8个连词,但在将来可以设置为检测97个前缀、23个后缀和204个头衔)

如果这不是你想要的,对于你的应用程序来说过于冗余,或者语言不正确,请检查此文件末尾的“致谢”部分,以获取链接到其他可能更适合你需求的解析器。

使用

基本用法

<?php
use ADCI\FullNameParser\Parser;
// some code ...
$parser = new Parser();

$name = 'Mr. David Davis';
$nameObject = $parser->parse($name);

$this->assertEquals('Mr.', $nameObject->getAcademicTitle());
$this->assertEquals('David', $nameObject->getFirstName());
$this->assertEquals('Davis', $nameObject->getLastName());

高级选项

suffixes(字符串数组,可选):覆盖要搜索的后缀列表。这些后缀可以以点在源名称字符串中结束。虽然你不必在这些后缀中包含点,但在解析时将自动处理点。

numeral_suffixes(字符串数组,可选):覆盖要搜索的数字后缀列表。不要包含尾随的点。

prefixes(字符串数组,可选):覆盖要搜索的前缀列表。

academic_titles(字符串数组,可选):覆盖要搜索的学术头衔列表。

part(字符串,可选):要返回的单个部分名称。

  • 'all' (默认) = 返回包含所有姓名部分的对象。
  • 'title' = 仅返回头衔(或空字符串)。
  • 'first' = 仅返回名字(或空字符串)。
  • 'middle' = 仅返回中间名(或空字符串)。
  • 'last' = 仅返回姓氏(或空字符串)。
  • 'nick' = 仅返回昵称(或空字符串)。
  • 'suffix' = 仅返回后缀(或空字符串)。
  • 'error' = 仅返回解析错误消息数组(或空数组)。

fix_case (布尔值|整数,可选):修复输出姓名的大小写。

  • 0或false(默认)= 从不修复大小写(保留和输出与输入姓名相同的大小写)。
  • 1或true = 总是修复输出的大小写,即使输入是混合大小写。

throws (布尔值|整数,可选):使解析错误抛出PHP错误。

  • 0 或 false = 返回解析错误警告,但继续。
  • 1 或 true(默认)= 如果发现解析错误,则抛出 PHP 错误。

mandatory_first_name(bool|integer, optional): 如果找不到名字,则抛出错误。

  • 0 或 false = 不抛出错误。
  • 1 或 true(默认)= 抛出错误。

mandatory_last_name(bool|integer, optional): 如果找不到姓氏,则抛出错误。

  • 0 或 false = 不抛出错误。
  • 1 或 true(默认)= 抛出错误。

mandatory_middle_name(bool|integer, optional): 如果有太多的中间名,则抛出警告。

  • 0 或 false = 不抛出警告。
  • 1 或 true(默认)= 抛出警告。

高级使用

<?php
use ADCI\FullNameParser\Parser;
// Some code...
// Example with advanced options.
$parser = new Parser(['part' => 'all', 'fix_case' => TRUE, 'throws' => FALSE]);
$name = 'DE LORENZO Y GUTIEREZ, Mr. JÜAN MARTINEZ (MARTIN) Jr.';
$nameObject = $parser->parse($name);

$this->assertEquals('Mr.', $nameObject->getAcademicTitle());
$this->assertEquals('Jüan', $nameObject->getFirstName());
$this->assertEquals('Martinez', $nameObject->getMiddleName());
$this->assertEquals('de Lorenzo y Gutierez', $nameObject->getLastName());
$this->assertEquals('Martin', $nameObject->getNicknames());
$this->assertEquals('Jr.', $nameObject->getSuffix());
$this->assertEquals([], $nameObject->getErrors());
// Some else code...
// And example with overriding suffixes and titles lists by short versions of lists.
$options = [
    'suffixes' => ['esq', 'jr', 'sr'],
    'academic_titles' => ['ms', 'mrs', 'mr'],
];
$parser = new Parser($options);
$nameObject = $parser->parse($name);

报告错误

如果您发现此函数无法正确解析某个名字或任何其他错误,请在此处报告:https://github.com/adci/full-name-parser/issues

致谢和先驱

此解析器基于并与 davidgorges/human-name-parser 兼容。

它还实现了来自 dschnelldavis/parse-full-name 的所有测试和大部分附加功能。