PHP Classes
elePHPant
Icontem

File: nameParser.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of G. Miernicki  >  Name Parser  >  nameParser.php  >  Download  
File: nameParser.php
Role: Class source
Content type: text/plain
Description: nameParser Class
Class: Name Parser
Parse a person full name to retrieve its parts
Author: By
Last change: new version 1.1
Date: 6 years ago
Size: 9,816 bytes
 

Contents

Class file image Download
<?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;
        }
    }
}