<?php /** * @package nameParser * @version 1.1 * @author Greg Miernicki, Keith Beckman, DLM * LastModified: 2009:0128 * License: LGPL * @link http://code.google.com/p/nameparser/ */
class nameParser {
/** * Array of possible name titles. * @var array */ private $titles;
/** * Array of possible last name prefixes. * @var array */ private $prefices;
/** * Array of possible name suffices. * @var array; */ private $suffices;
/** * The TITLE ie. Dr., Mr. Mrs., etc... * @var string */ private $title;
/** * The FIRST Name * @var string */ private $first;
/** * The MIDDLE Name * @var string */ private $middle;
/** * The LAST Name * @var string */ private $last;
/** * Name addendum ie. III, Sr., etc... * @var string */ private $suffix;
/** * Full name string passed to class * @var string */ private $fullName;
/** * Set to false by default, but set to true if parse() is executed on a name that is not parseable * @var boolean */ private $notParseable;
/** * Constructor: * Setup the object, initialise the variables, and if instantiated with a name - parse it automagically * * @param string The Name String * @access public */ public function __construct( $initString = "" ) { $this->title = ""; $this->first = ""; $this->middle = ""; $this->last = ""; $this->suffix = "";
//$this->titles = array('dr','doctor','miss','misses','mr','mister','mrs','ms','judge','sir','madam','madame');
// added Military Titles $this->titles = array('dr','doctor','miss','misses','mr','mister','mrs','ms','judge','sir','madam','madame','AB','2ndLt','Amn','1stLt','A1C','Capt','SrA','Maj','SSgt','LtCol','TSgt','Col','BrigGen','1stSgt','MajGen','SMSgt','LtGen','1stSgt','Gen','CMSgt','1stSgt','CCMSgt','CMSAF','PVT','2LT','PV2','1LT','PFC','CPT','SPC','MAJ','CPL','LTC','SGT','COL','SSG','BG','SFC','MG','MSG','LTG','1SGT','GEN','SGM','CSM','SMA','WO1','WO2','WO3','WO4','WO5','ENS','SA','LTJG','SN','LT','PO3','LCDR','PO2','CDR','PO1','CAPT','CPO','RADM(LH)','SCPO','RADM(UH)','MCPO','VADM','MCPOC','ADM','MPCO-CG','CWO-2','CWO-3','CWO-4','Pvt','2ndLt','PFC','1stLt','LCpl','Capt','Cpl','Maj','Sgt','LtCol','SSgt','Col','GySgt','BGen','MSgt','MajGen','1stSgt','LtGen','MGySgt','Gen','SgtMaj','SgtMajMC','WO-1','CWO-2','CWO-3','CWO-4','CWO-5','ENS','SA','LTJG','SN','LT','PO3','LCDR','PO2','CDR','PO1','CAPT','CPO','RDML','SCPO','RADM','MCPO','VADM','MCPON','ADM','FADM','WO1','CWO2','CWO3','CWO4','CWO5');
$this->prefices = array('bon','ben','bin','da','dal','de','del','der','de','e','la','le','san','st','ste','van','vel','von'); $this->suffices = array('esq','esquire','jr','sr','2','i','ii','iii','iv','v','clu','chfc','cfp','md','phd'); $this->fullName = ""; $this->notParseable = FALSE;
// if initialized by value, set class variable and then parse if ( $initString != "" ) { $this->fullName = $initString; $this->parse(); } }
/** * Destructor * @access public */ public function __destruct() {}
/** * Access Method * @access public */ public function getFirstName() { return $this->first; }
/** * Access Method * @access public */ public function getMiddleName() { return $this->middle; }
/** * Access Method * @access public */ public function getLastName() { return $this->last; }
/** * Access Method * @access public */ public function getTitle() { return $this->title; }
/** * Access Method * @access public */ public function getSuffix() { return $this->suffix; }
/** * Access Method * @access public */ public function getNotParseable() { return $this->notParseable; }
/** * Mutator Method * @access public * @param newFullName the new value to set fullName to */ public function setFullName( $newFullName ) { $this->fullName = $newFullName; }
/** * Determine if the needle is in the haystack. * * @param needle the needle to look for * @param haystack the haystack from which to look into * @access private */ private function inArrayNorm( $needle, $haystack ) { $needle = trim( strtolower( str_replace( '.', '', $needle ) ) ); return in_array( $needle, $haystack ); }
/** * Extract the elements of the full name into separate parts. * * @access public */ public function parse() { // reset values $this->title = ""; $this->first = ""; $this->middle = ""; $this->last = ""; $this->suffix = ""; $this->notParseable = FALSE;
// break up name based on number of commas $pieces = explode( ',', preg_replace('/\s+/', ' ', trim( $this->fullName ) ) ); $numPieces = count( $pieces );
switch ( $numPieces ) {
// array(title first middle last suffix) case 1: $subPieces = explode(' ', trim( $pieces[0] ) ); $numSubPieces = count( $subPieces ); for ( $i = 0; $i < $numSubPieces; $i++ ) { $current = trim( $subPieces[$i] ); if ( $i < ($numSubPieces-1) ) { $next = trim( $subPieces[$i+1] ); } else { $next = ""; } if ( $i == 0 && $this->inArrayNorm( $current, $this->titles ) ) { $this->title = $current; continue; } if ( $this->first == "" ) { $this->first = $current; continue; } if ( $i == $numSubPieces-2 && ($next != "") && $this->inArrayNorm( $next, $this->suffices ) ) { if ( $this->last != "") { $this->last .= " ".$current; } else { $this->last = $current; } $this->suffix = $next; break; } if ( $i == $numSubPieces-1 ) { if ( $this->last != "" ) { $this->last .= " ".$current; } else { $this->last = $current; } continue; } if ( $this->inArrayNorm( $current, $this->prefices ) ) { if ( $this->last != "" ) { $this->last .= " ".$current; } else { $this->last = $current; } continue; } if ( $next == 'y' || $next == 'Y' ) { if ( $this->last != "" ) { $this->last .= " ".$current; } else { $this->last = $current; } continue; } if ( $this->last != "" ) { $this->last .= " ".$current; continue; } if( $this->middle != "" ) { $this->middle .= " ".$current; } else { $this->middle = $current; } } break;
default: switch( $this->inArrayNorm( $pieces[1], $this->suffices ) ) {
// array(title first middle last, suffix [, suffix]) case TRUE: $subPieces = explode(' ', trim( $pieces[0] ) ); $numSubPieces = count( $subPieces ); for ( $i = 0; $i < $numSubPieces; $i++ ) { $current = trim( $subPieces[$i] ); if ( $i < ($numSubPieces-1) ) { $next = trim( $subPieces[$i+1] ); } else { $next = ""; } if ( $i == 0 && $this->inArrayNorm( $current, $this->titles ) ) { $this->title = $current; continue; } if ( $this->first == "" ) { $this->first = $current; continue; } if ( $i == $numSubPieces-1 ) { if ( $this->last != "" ) { $this->last .= " ".$current; } else { $this->last = $current; } continue; } if ( $this->inArrayNorm( $current, $this->prefices ) ) { if ( $this->last != "" ) { $this->last .= " ".$current; } else { $this->last = $current; } continue; } if ( $next == 'y' || $next == 'Y' ) { if ( $this->last != "" ) { $this->last .= " ".$current; } else { $this->last = $current; } continue; } if ( $this->last != "" ) { $this->last .= " ".$current; continue; } if ( $this->middle != "" ) { $this->middle .= " ".$current; } else { $this->middle = $current; } } $this->suffix = trim($pieces[1]); for ( $i = 2; $i < $numPieces; $i++ ) { $this->suffix .= ", ". trim( $pieces[$i] ); } break;
// array(last, title first middles[,] suffix [,suffix]) case FALSE: $subPieces = explode( ' ', trim( $pieces[1] ) ); $numSubPieces = count( $subPieces ); for ( $i = 0; $i < $numSubPieces; $i++ ) { $current = trim( $subPieces[$i] ); if ( $i < ($numSubPieces-1) ) { $next = trim( $subPieces[$i+1] ); } else { $next = ""; } if ( $i == 0 && $this->inArrayNorm( $current, $this->titles ) ) { $this->title = $current; continue; } if ( $this->first == "" ) { $this->first = $current; continue; } if ( $i == $numSubPieces-2 && ($next != "") && $this->inArrayNorm( $next, $this->suffices ) ) { if ( $this->middle != "" ) { $this->middle .= " ".$current; } else { $this->middle = $current; } $this->suffix = $next; break; } if ( $i == $numSubPieces-1 && $this->inArrayNorm( $current, $this->suffices ) ) { $this->suffix = $current; continue; } if ( $this->middle != "" ) { $this->middle .= " ".$current; } else { $this->middle = $current; } } if( isset($pieces[2]) && $pieces[2] ) { if ( $this->last == "" ) { $this->suffix = trim( $pieces[2] ); for ($s = 3; $s < $numPieces; $s++) { $this->suffix .= ", ". trim( $pieces[$s] ); } } else { for ($s = 2; $s < $numPieces; $s++) { $this->suffix .= ", ". trim( $pieces[$s] ); } } } $this->last = $pieces[0]; break; } unset( $pieces ); break; } if ( $this->first == "" && $this->middle == "" && $this->last == "" ) { $this->notParseable = TRUE; } } }
|