private function parse()
{
$suffixes = implode("\\.*|", $this->suffixes) . "\\.*";
// each suffix gets a "\.*" behind it.
$prefixes = implode(" |", $this->prefixes) . " ";
// each prefix gets a " " behind it.
// The regex use is a bit tricky. *Everything* matched by the regex will be replaced,
// but you can select a particular parenthesized submatch to be returned.
// Also, note that each regex requres that the preceding ones have been run, and matches chopped out.
$nicknamesRegex = "/ ('|\"|\\(\"*'*)(.+?)('|\"|\"*'*\\)) /";
// names that starts or end w/ an apostrophe break this
$suffixRegex = "/,* *({$suffixes})\$/";
$lastRegex = "/(?!^)\\b([^ ]+ y |{$prefixes})*[^ ]+\$/";
$leadingInitRegex = "/^(.\\.*)(?= \\p{L}{2})/";
// note the lookahead, which isn't returned or replaced
$firstRegex = "/^[^ ]+/";
//
// get nickname, if there is one
$this->nicknames = $this->name->chopWithRegex($nicknamesRegex, 2);
// get suffix, if there is one
$this->suffix = $this->name->chopWithRegex($suffixRegex, 1);
// flip the before-comma and after-comma parts of the name
$this->name->flip(",");
// get the last name
$this->last = $this->name->chopWithRegex($lastRegex, 0);
if (!$this->last) {
throw new Exception("Couldn't find a last name in '{$this->name->getStr()}'.");
}
// get the first initial, if there is one
$this->leadingInit = $this->name->chopWithRegex($leadingInitRegex, 1);
// get the first name
$this->first = $this->name->chopWithRegex($firstRegex, 0);
if (!$this->first) {
throw new Exception("Couldn't find a first name in '{$this->name->getStr()}'");
}
// if anything's left, that's the middle name
$this->middle = $this->name->getStr();
return true;
}