*/ class soundex2 { /** * public sString * main string we work on */ var $sString = ''; /** * vowels replacement array */ var $aReplaceVoy1 = array ( 'E' => 'A', 'I' => 'A', 'O' => 'A', 'U' => 'A' ); /** * consonnants replacement array */ var $aReplaceGrp1 = array ( 'GUI' => 'KI', 'GUE' => 'KE', 'GA' => 'KA', 'GO' => 'KO', 'GU' => 'K', 'CA' => 'KA', 'CO' => 'KO', 'CU' => 'KU', 'Q' => 'K', 'CC' => 'K', 'CK' => 'K' ); /** * other replacement array */ var $aReplaceGrp2 = array ( 'ASA' => 'AZA', 'KN' => 'NN', 'PF' => 'FF', 'PH' => 'FF', 'SCH' => 'SSS' ); /** * endings replacement array */ var $aEnd = array ( 'A', 'T', 'D', 'S' ); /** * public function build * core function of the class, go through the whole process * @Param string sString : the string we want to check */ function build ($sString) { /** * let's check it's a real string... */ if (is_string ($sString) && !empty ($sString)) { $this -> sString = $sString; } else { $this -> sString = ''; //trigger_error ('Parameter string must not be empty', E_USER_ERROR); } /** * remove starting and ending spaces */ $this -> sString = trim ($this -> sString); /** * remove special french characters */ $this -> trimAccent (); /** * string to upper case */ $this -> sString = strtoupper ($this -> sString ); /** * let's remove every space in the string */ $this -> sString = str_replace (' ', '', $this -> sString); /** * let's remove every '-' in the string */ $this -> sString = str_replace ('-', '', $this -> sString); /** * let's process through the first replacement array */ $this -> arrReplace ($this -> aReplaceGrp1); /** * let's process through th vowels replacement */ $sChar = substr ($this -> sString, 0, 1); $this -> sString = substr ($this -> sString, 1, strlen ($this -> sString) - 1); $this -> arrReplace ($this -> aReplaceVoy1); $this -> sString = $sChar.$this -> sString; /** * let's process through the second replacement array */ $this -> arrReplace ($this -> aReplaceGrp2, true); /** * let's remove every 'H' but those prededed by a 'C' or an 'S' */ $this -> sString = preg_replace ('/(? sString); /** * let's remove every 'Y' but those preceded by an 'A' */ $this -> sString = preg_replace ('/(? sString); /** * remove endings in aEnd */ $length = strlen ($this -> sString) - 1; if (in_array ($this -> sString{$length}, $this -> aEnd)) { $this -> sString = substr ($this -> sString, 0, $length); } /** * let's remove every 'A', but the one at the beginning of the string, if any. */ $sChar = ''; if ($this -> sString{0} === 'A') { $sChar = 'A'; } $this -> sString = str_replace ('A', '', $this -> sString); $this -> sString = $sChar.$this -> sString; /** * let's have only 1 occurence of each letter */ $this -> sString = preg_replace( '/(.)\1/', '$1', $this -> sString ); /** * let's have the final code : a 4 letters string */ $this -> getFinal (); } /** * private function getFinal * gets the first 4 letters, pads the string with white space if the string length < 4 */ function getFinal () { if (strlen ($this -> sString) < 4) { $this -> sString = str_pad ($this -> sString, 4, ' ', STR_PAD_RIGHT); } else { $this -> sString = substr ($this -> sString, 0, 4); } } /** * private function trimAccent * remove every special French letters */ function trimAccent () { $this -> sString = htmlentities(strtolower($this -> sString )); $this -> sString = preg_replace("/&(.)(acute|cedil|circ|ring|tilde|uml|grave);/", "$1", $this -> sString ); $this -> sString = preg_replace("/([^a-z0-9]+)/", "-", html_entity_decode($this -> sString )); $this -> sString = trim($this -> sString , "-"); } /** * private function arrReplace * replacement method, given an array * @Param array tab : the replacement array to be used * @Param bool pref : if false, just replace keys by values; if true, do the same but only with prefix */ function arrReplace ($tab, $pref = false) { $fromRep = array_keys ($tab); $toRep = array_values ($tab); if (false === $pref) { $this -> sString = str_replace ($fromRep, $toRep, $this -> sString); } else { foreach ($fromRep as $clef => $val) { $length = strlen ($val); if (substr ($this -> sString, 0, $length) === $val) { $this -> sString = substr_replace ($this -> sString, $toRep[$clef], 0, $length); } } } } } ?>