<?php 
/** 
* CLASS soundex2 
* soundex2 French version 
* based on the algorithm described here : http://sqlpro.developpez.com/cours/soundex/ by Frédéric BROUARD 
* 
* author Johan Barbier <[email protected]> 
*/ 
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 { 
            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 ('/(?<![CS])H/', '', $this -> sString); 
        /** 
        * let's remove every 'Y' but those preceded by an 'A' 
        */ 
        $this -> sString = preg_replace ('/(?<!A)Y/', '', $this -> 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); 
                } 
            } 
        } 
    } 
 
} 
?> 
 
 |