theiconic/name-parser
PHP library for parsing human names into structured parts. Handles titles, first/middle/last names, initials, prefixes/suffixes, and common edge cases, making it easier to normalize, store, and display names consistently in your apps.
Installation
composer require theiconic/name-parser
No additional configuration is required—just autoload the package.
First Use Case Parse a name string into structured components:
use TheIconic\NameParser\NameParser;
$parser = new NameParser();
$result = $parser->parse('John Michael Doe');
// Outputs structured data:
// [
// 'first_name' => 'John',
// 'middle_name' => 'Michael',
// 'last_name' => 'Doe',
// 'suffix' => null,
// 'prefix' => null,
// 'full_name' => 'John Michael Doe'
// ]
Where to Look First
NameParser class methods (parse(), parseWithOptions()).NameParser::DEFAULT_RULES for built-in heuristics (e.g., suffixes like "Jr.", prefixes like "Dr.").Basic Parsing
$parser = new NameParser();
$nameData = $parser->parse('Vanessa Anne Smith-Johnson');
Custom Rules Override default rules for domain-specific needs:
$customRules = [
'prefixes' => ['Prof.', 'Rev.'],
'suffixes' => ['PhD', 'MD'],
];
$parser = new NameParser($customRules);
$result = $parser->parse('Prof. Maria Garcia PhD');
Integration with Laravel
use Illuminate\Validation\Rule;
$validator->after(function ($validator) {
$name = $validator->getData()['name'];
$parser = new NameParser();
$parsed = $parser->parse($name);
$validator->errors()->merge([
'name' => [
Rule::required()->message('Name is required.'),
Rule::string()->message('Name must be a string.'),
],
]);
});
protected $casts = [
'full_name' => NameParser::class,
];
Batch Processing Parse arrays of names efficiently:
$names = ['Alice', 'Bob Jr.', 'Charlie van Dijk'];
$parser = new NameParser();
$results = array_map([$parser, 'parse'], $names);
NameParser and overriding parse().league/address for international names) for robustness.False Positives in Rules
parseWithOptions() to disable ambiguous rules:
$parser->parseWithOptions('MacDonald', ['strict' => true]);
Performance with Large Datasets
Edge Cases
O'Connor), non-standard formats (123 Main St), or empty strings.if (empty($name) || !is_string($name)) {
throw new \InvalidArgumentException('Invalid name format.');
}
var_dump($parser->getRules());
\Log::debug('Parsed name:', $parsedData);
Custom Parsers
Extend NameParser for domain-specific logic:
class MedicalNameParser extends NameParser {
protected function getRules() {
$rules = parent::getRules();
$rules['suffixes'][] = 'DO'; // Medical suffix
return $rules;
}
}
Plugin System Dynamically add rules at runtime:
$parser = new NameParser();
$parser->addRule('prefixes', ['Sir']);
$parser->addRule('suffixes', ['Esq.']);
Integration with Laravel Services Bind the parser to the container for dependency injection:
$this->app->singleton(NameParser::class, function ($app) {
return new NameParser($app['config']['name_parser.rules']);
});
How can I help you explore Laravel packages today?