danielebarchiesi@4: getLast() . ", " . $parser->getFirst(); danielebarchiesi@4: * //returns "Smith, John" danielebarchiesi@4: * danielebarchiesi@4: * danielebarchiesi@4: */ danielebarchiesi@4: class HumanNameParser_Parser { danielebarchiesi@4: private $name; danielebarchiesi@4: private $nameParts = array(); danielebarchiesi@4: private $leadingInit; danielebarchiesi@4: private $first; danielebarchiesi@4: private $nicknames; danielebarchiesi@4: private $middle; danielebarchiesi@4: private $last; danielebarchiesi@4: private $suffix; danielebarchiesi@4: private $category; danielebarchiesi@4: private $type; danielebarchiesi@4: private $literal; danielebarchiesi@4: danielebarchiesi@4: private $suffixes; danielebarchiesi@4: private $prefixes; danielebarchiesi@4: danielebarchiesi@4: /* danielebarchiesi@4: * Constructor danielebarchiesi@4: * danielebarchiesi@4: * @param mixed $name Either a name as a string or as a Name object. danielebarchiesi@4: */ danielebarchiesi@4: public function __construct($name = NULL) danielebarchiesi@4: { danielebarchiesi@4: $this->suffixes = array('esq','esquire','jr','sr','2','ii','iii','iv'); danielebarchiesi@4: $this->prefixes = array('bar','ben','bin','da','dal','de la', 'de', 'del','der','di', danielebarchiesi@4: 'ibn','la','le','san','st','ste','van', 'van der', 'van den', 'vel','von'); danielebarchiesi@4: $this->setName($name); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: public function parseName($name = NULL, $category = NULL) { danielebarchiesi@4: $this->literal = 0; danielebarchiesi@4: $this->category = 1; danielebarchiesi@4: $this->type = 1; danielebarchiesi@4: if (is_array($name) && isset($name['name'])) { danielebarchiesi@4: if (isset($name['auth_category']) && !empty($name['auth_category']) && empty($category)) { danielebarchiesi@4: $this->category = $name['auth_category']; danielebarchiesi@4: } danielebarchiesi@4: elseif (!empty($category)) { danielebarchiesi@4: $this->category = $category; danielebarchiesi@4: } danielebarchiesi@4: if (isset($name['auth_type']) && !empty($name['auth_type'])) { danielebarchiesi@4: $this->type = $name['auth_type']; danielebarchiesi@4: } danielebarchiesi@4: $this->nameParts = $name; danielebarchiesi@4: $this->setName($name['name'], $category); danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: $this->nameParts['name'] = $name; danielebarchiesi@4: $this->setName($name, $category); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: return $this->getArray(); danielebarchiesi@4: } danielebarchiesi@4: /** danielebarchiesi@4: * Sets name string and parses it. danielebarchiesi@4: * Takes Name object or a simple string (converts the string into a Name obj), danielebarchiesi@4: * parses and loads its constituant parts. danielebarchiesi@4: * danielebarchiesi@4: * @param mixed $name Either a name as a string or as a Name object. danielebarchiesi@4: */ danielebarchiesi@4: public function setName($name = NULL, $category = NULL){ danielebarchiesi@4: if ($name) { danielebarchiesi@4: $this->category == $category; danielebarchiesi@4: danielebarchiesi@4: if (is_object($name) && get_class($name) == "HumanNameParser_Name") { // this is mostly for testing danielebarchiesi@4: $this->name = $name; danielebarchiesi@4: } danielebarchiesi@4: elseif (is_array($name) && isset($name['name'])) { danielebarchiesi@4: $this->name = new HumanNameParser_Name($name['name']); danielebarchiesi@4: $this->nameParts = $name; danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: $this->name = new HumanNameParser_Name($name); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: $this->leadingInit = ""; danielebarchiesi@4: $this->first = ""; danielebarchiesi@4: $this->nicknames = ""; danielebarchiesi@4: $this->middle = ""; danielebarchiesi@4: $this->last = ""; danielebarchiesi@4: $this->suffix = ""; danielebarchiesi@4: danielebarchiesi@4: if ($this->category == 5 || $this->type == 5) { danielebarchiesi@4: $this->last = $name; danielebarchiesi@4: $this->literal = TRUE; danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: $this->parse(); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: public function getleadingInit() { danielebarchiesi@4: return $this->leadingInit; danielebarchiesi@4: } danielebarchiesi@4: public function getFirst() { danielebarchiesi@4: return $this->first; danielebarchiesi@4: } danielebarchiesi@4: public function getNicknames() { danielebarchiesi@4: return $this->nicknames; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: public function getMiddle() { danielebarchiesi@4: return $this->middle; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: public function getLast() { danielebarchiesi@4: return $this->last; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: public function getSuffix() { danielebarchiesi@4: return $this->suffix; danielebarchiesi@4: } danielebarchiesi@4: public function getName(){ danielebarchiesi@4: return $this->name; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * returns all the parts of the name as an array danielebarchiesi@4: * danielebarchiesi@4: * @param String $arrType pass 'int' to get an integer-indexed array (default is associative) danielebarchiesi@4: * @return array An array of the name-parts danielebarchiesi@4: */ danielebarchiesi@4: public function getArray($arrType = 'assoc') { danielebarchiesi@4: $arr = array(); danielebarchiesi@4: $arr['prefix'] = $this->leadingInit; danielebarchiesi@4: $arr['firstname'] = $this->first; danielebarchiesi@4: $arr['nicknames'] = $this->nicknames; danielebarchiesi@4: $arr['initials'] = substr($this->middle, 0, 10); danielebarchiesi@4: $arr['lastname'] = $this->last; danielebarchiesi@4: $arr['suffix'] = $this->suffix; danielebarchiesi@4: $arr['md5'] = md5(json_encode($arr)); danielebarchiesi@4: $arr['literal'] = $this->literal; danielebarchiesi@4: danielebarchiesi@4: if ($arrType == 'assoc') { danielebarchiesi@4: return array_merge($this->nameParts, $arr); danielebarchiesi@4: } danielebarchiesi@4: else if ($arrType == 'int'){ danielebarchiesi@4: return array_values($arr); danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: throw new Exception("Array must be associative ('assoc') or numeric ('num')."); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* danielebarchiesi@4: * Parse the name into its constituent parts. danielebarchiesi@4: * danielebarchiesi@4: * Sequentially captures each name-part, working in from the ends and danielebarchiesi@4: * trimming the namestring as it goes. danielebarchiesi@4: * danielebarchiesi@4: * @return boolean true on success danielebarchiesi@4: */ danielebarchiesi@4: private function parse() danielebarchiesi@4: { danielebarchiesi@4: $suffixes = implode("\.*|", $this->suffixes) . "\.*"; // each suffix gets a "\.*" behind it. danielebarchiesi@4: $prefixes = implode(" |", $this->prefixes) . " "; // each prefix gets a " " behind it. danielebarchiesi@4: danielebarchiesi@4: // The regex use is a bit tricky. *Everything* matched by the regex will be replaced, danielebarchiesi@4: // but you can select a particular parenthesized submatch to be returned. danielebarchiesi@4: // Also, note that each regex requres that the preceding ones have been run, and matches chopped out. danielebarchiesi@4: $nicknamesRegex = "/ ('|\"|\(\"*'*)(.+?)('|\"|\"*'*\)) /"; // names that starts or end w/ an apostrophe break this danielebarchiesi@4: $suffixRegex = "/,* *($suffixes)$/"; danielebarchiesi@4: $lastRegex = "/(?!^)\b([^ ]+ y |$prefixes)*[^ ]+$/"; danielebarchiesi@4: $leadingInitRegex = "/^(.\.*)(?= \p{L}{2})/"; // note the lookahead, which isn't returned or replaced danielebarchiesi@4: $firstRegex = "/^[^ ]+/"; // danielebarchiesi@4: danielebarchiesi@4: // get nickname, if there is one danielebarchiesi@4: $this->nicknames = $this->name->chopWithRegex($nicknamesRegex, 2); danielebarchiesi@4: danielebarchiesi@4: // get suffix, if there is one danielebarchiesi@4: $this->suffix = $this->name->chopWithRegex($suffixRegex, 1); danielebarchiesi@4: danielebarchiesi@4: // flip the before-comma and after-comma parts of the name danielebarchiesi@4: $this->name->flip(","); danielebarchiesi@4: danielebarchiesi@4: // get the last name danielebarchiesi@4: $this->last = $this->name->chopWithRegex($lastRegex, 0); danielebarchiesi@4: if (!$this->last){ danielebarchiesi@4: throw new Exception("Couldn't find a last name in '{$this->name->getStr()}'."); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: // get the first initial, if there is one danielebarchiesi@4: $this->leadingInit = $this->name->chopWithRegex($leadingInitRegex, 1); danielebarchiesi@4: danielebarchiesi@4: // get the first name danielebarchiesi@4: $this->first = $this->name->chopWithRegex($firstRegex, 0); danielebarchiesi@4: if (!$this->first && $this->category != 5){ danielebarchiesi@4: throw new Exception("Couldn't find a first name in '{$this->name->getStr()}'"); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: // if anything's left, that's the middle name danielebarchiesi@4: $this->middle = $this->name->getStr(); danielebarchiesi@4: return true; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: danielebarchiesi@4: danielebarchiesi@4: danielebarchiesi@4: danielebarchiesi@4: } danielebarchiesi@4: ?>