diff --git a/cosmogramme/php/classes/classe_indexation.php b/cosmogramme/php/classes/classe_indexation.php index fb4b4a2652860d3e2801b01d331e7ad4702cf046..c340edaaea13d528dfb96521192569d5e18c8e52 100644 --- a/cosmogramme/php/classes/classe_indexation.php +++ b/cosmogramme/php/classes/classe_indexation.php @@ -1,4 +1,4 @@ -<?PHP +<?php /** * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved. * @@ -18,250 +18,17 @@ * along with BOKEH; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -//////////////////////////////////////////////////////////////////////// -// CALCUL DES INDEX -/////////////////////////////////////////////////////////////////////// -class indexation { - private $articles; // Articles rejetes - private $inclu; // Mots inclus - private $exclu; // Mots vides - private $pluriel; // Règles des pluriels - private $tableMajFrom, $tableMajTo = []; // Table de transco pour majuscules - private $tableMajUtf8; // Table de transco pour majuscules accentuées utf8 - public static $phonetixCache = []; - private $accents = ['É' => 'E', 'È' => 'E', 'Ë' => 'E', 'Ê' => 'E','Ã' => 'A', 'À' => 'A', 'Ä' => 'A', 'Â' => 'A', - 'Ã…' => 'A', 'Ã' => 'A', 'Æ' => 'E','Ã' => 'I', 'ÃŽ' => 'I', 'ÃŒ' => 'I', 'Ã' => 'I', - 'Ô' => 'O', 'Ö' => 'O', 'Ã’' => 'O', 'Ó' => 'O', 'Õ' => 'O', 'Ø' => 'O', 'Å’' => 'OEU', - 'Ú' => 'U', 'Ù' => 'U', 'Û' => 'U', 'Ãœ' => 'U','Ñ' => 'N', 'Ç' => 'S', '¿' => 'E']; +class indexation extends Class_Indexation { + protected static $phonetixCache = []; - private $min2maj = ['é' => 'É', 'è' => 'È', 'ë' => 'Ë', 'ê' => 'Ê','á' => 'Ã', 'â' => 'Â', 'à ' => 'À', 'Ä' => 'A', - 'Â' => 'A', 'Ã¥' => 'Ã…', 'ã' => 'Ã', 'æ' => 'Æ', 'ï' => 'Ã', 'î' => 'ÃŽ', 'ì' => 'ÃŒ', 'Ã' => 'Ã', - 'ô' => 'Ô', 'ö' => 'Ö', 'ò' => 'Ã’', 'ó' => 'Ó','õ' => 'Õ', 'ø' => 'Ø', 'Å“' => 'Å’', - 'ú' => 'Ú', 'ù' => 'Ù', 'û' => 'Û', 'ü' => 'Ãœ','ç' => 'Ç', 'ñ' => 'Ñ', 'ß' => 'S']; - -// Contructeur (init les règles d'indexation) - function __construct() - { + public function __construct() { if (empty(static::$phonetixCache)) static::$phonetixCache = unserialize(file_get_contents(dirname(__FILE__).'/phonetix.txt')); - - // Lire formes rejetées - $this->articles=array("L'","LE ","LA ","LES ","UN ","UNE "); - $this->inclu=array("AN","AS","OR","U2","AI","LU","XO","DO","RE","MI","FA","SI","AC","DC","XX","B","C","D","E","F","G","H","I","J","K","M","P","Q","R","S","T","V","W","X","Y","Z","L","YU","UT","LI","OC","PI","ZU","WU","TO","OZ","ZZ","XX"); - $this->exclu = array("L","LE","LA","LES","UN","UNE","LES","DES","MES","TES","CES"); - - // Pluriels - $this->pluriel=array( - array("AIL","AULX"), - array("AVAL","AVALS"), - array("BAIL","BAUX"), - array("BAL","BALS"), - array("BANAL","BANALS"), - array("BANCAL","BANCALS"), - array("BIJOU","BIJOUX"), - array("BLEU","BLEUS"), - array("CAILLOU","CAILLOUX"), - array("CAL","CALS"), - array("CARNAVAL","CARNAVALS"), - array("CEREMONIAL","CEREMONIALS"), - array("CHACAL","CHACALS"), - array("CHORAL","CHORALS"), - array("CHOU","CHOUX"), - array("CORAIL","CORAUX"), - array("DETAIL","DETAILS"), - array("EMAIL","EMAUX"), - array("EMEU","EMEUS"), - array("ETAL","ETALS"), - array("FATAL","FATALS"), - array("FESTIVAL","FESTIVALS"), - array("GEMMAIL","GEMMAUX"), - array("GENOU","GENOUX"), - array("HIBOU","HIBOUX"), - array("JOUJOU","JOUJOUX"), - array("LANDAU","LANDAUX"), - array("NATAL","NATALS"), - array("OEIL","YEUX"), - array("PAL","PALS"), - array("PNEU","PNEUS"), - array("POU","POUX"), - array("RECITAL","RECITALS"), - array("REGAL","REGALS"), - array("SARRAU","SARRAUS"), - array("SOUPIRAIL","SOUPIRAUX"), - array("TONAL","TONALS"), - array("TRAVAIL","TRAVAUX"), - array("VAL","VALS"), - array("VENTAIL","VENTAUX"), - array("VIRGINAL","VIRGINALS"), - array("VITRAIL","VITRAUX"), - array("*EAU","*EAUX"), - array("*AL","*AUX"), - array("*EU","*EUX"), - array("*AU","*AUX") - ); - - // Init table ascii pour majuscules - $this->tableMajTo = str_split(str_repeat( " ", 42 ) - . "* 0123456789 " - . "ABCDEFGHIJKLMNOPQRSTUVWXYZ " - . "ABCDEFGHIJKLMNOPQRSTUVWXYZ " - . str_repeat( " ", 63) - ."AAAAAAACEEEEIIII NOOOOO UUUUY AAAAAAACEEEEIIII NOOOOO UUUUY Y"); - - for($i=0; $i<count($this->tableMajTo); $i++) - $this->tableMajFrom[] = chr($i); - - - $this->tableMajUtf8=array(chr(0xC9) => 'E', 'È' => 'E', 'Ë' => 'E', 'Ê' => 'E','Ã' => 'A', 'À' => 'A', 'Ä' => 'A', 'Â' => 'A', - 'Ã…' => 'A', 'Ã' => 'A', 'Æ' => 'E','Ã' => 'I', 'ÃŽ' => 'I', 'ÃŒ' => 'I', 'Ã' => 'I', - 'Ô' => 'O', 'Ö' => 'O', 'Ã’' => 'O', 'Ó' => 'O', 'Õ' => 'O', 'Ø' => 'O', 'Å’' => 'OEU', - 'Ú' => 'U', 'Ù' => 'U', 'Û' => 'U', 'Ãœ' => 'U','Ñ' => 'N', 'Ç' => 'S', '¿' => 'E'); - } - // Indexation d'un titre - public function codeAlphaTitre($titre) - { - $titre=$this->alphaMaj($titre); - foreach($this->articles as $article) - { - $lg=strlen($article); - if(strLeft($titre, $lg)==$article) {$titre=strMid($titre,$lg,256); break;} - } - $titre=$this->alphaMaj($titre); - return $titre; + parent::__construct(); } - // Rend une suite de mots complete pour les formes plurielles - public function getExpressionRecherche($mot) - { - $mot=trim($mot); - if(!$mot) return false; - // Pluriel - if(strRight($mot,1) == "*") {$etoile="*";$mot=strLeft($mot, strlen($mot)-1);} - $m=$this->getPluriel($mot); - $m[2]=$this->phonetix($m[0]); - $ret="(".$m[0].$etoile." ".$m[1]." ".$m[2].")"; - return trim($ret); - } - - - public function alphaMaj( $chaine ) { - return trim(str_replace($this->tableMajFrom, - $this->tableMajTo, - utf8_decode($chaine))); - } - - - public function getClefAlpha($type_doc,$titre,$complement_titre,$auteur,$tome,$editeur,$annee) - { - $clef=$this->getClefOeuvre($titre,$complement_titre,$auteur,$tome)."-"; - $clef.=substr($this->alphaMaj(str_replace(" ","",$editeur)),0,80)."-"; - $clef.=$annee."-"; - $clef.=$type_doc; - $clef=str_replace(" ","",$clef); - return $clef; - } - -// Rend une clef alpha pour les oeuvres - public function getClefOeuvre($titre,$complement_titre,$auteur,$tome) - { - $clef = substr($this->codeAlphaTitre(strtoupper(str_replace(" ","",$titre))),0,80)."-"; - $clef.=substr($this->codeAlphaTitre(strtoupper(str_replace(" ","",$complement_titre))),0,20)."-"; - $clef.=substr($this->alphaMaj(str_replace(" ","",$auteur)),0,80)."-"; - $clef.=$this->alphaMaj($tome); - $clef=str_replace(" ","",$clef); - return $clef; - } - -// Decoupe une expression en mots en tenant compte des exclusions / inclusions - public function getMots( $chaine ) - { - $new=array(); - $chaine = str_replace( ".", "", $chaine); - $chaine = trim($this->alphaMaj($chaine)); - $mot = explode( " ", $chaine ); - $index = 0; - for( $i = 0; $i < count($mot); $i++) - { - // Retirer mots de 2 lettres sauf les inclus et les nombres - if( strLen($mot[$i]) < 3 And intVal($mot[$i])==false) - { - if( in_array( $mot[$i], $this->inclu) == false) continue; - if(strlen($mot[$i])==1) $mot[$i].="00"; // mots d'1 lettre : on double la lettre - } - // Retirer mots vides - if( in_array($mot[$i], $this->exclu ) == true ) continue; - // On garde le mot - $new[$index++] = $mot[$i]; - } - return $new; - } - -// Rend une chaine de mots dedoublonnes et filtres - public function getFulltext($data) { - if (gettype($data) != "array") - $data=array($data); - - $new=" "; - foreach($data as $chaine) - { - $mots=$this->getMots($chaine); - foreach($mots as $mot) - { - $mot=" ".$mot." "; - if(strpos($new,$mot) === false ) - { - $new.=trim($mot)." "; - $phonem=" ".$this->phonetix(trim($mot))." "; - if($phonem and strpos($new,$phonem) === false ) $new.=trim($phonem)." "; - } - } - } - return trim($new); - } - -// Rend le mot au singulier et au pluriel - public function getPluriel( $mot ) - { - if( strToUpper($mot) != $mot ) $mot=$this->alphaMaj($mot); - if(!trim($mot)) return false; - foreach($this->pluriel as $regle) - { - if(strLeft($regle[0],1) != "*") - { - if($mot==$regle[0] or $mot==$regle[1]) return $regle; - else continue; - } - $regle[0]=str_replace("*","",$regle[0]); - $regle[1]=str_replace("*","",$regle[1]); - $pattern_singulier = "(".$regle[0]."$)"; - $pattern_pluriel="(".$regle[1]."$)"; - - $pluriel=ereg_replace($pattern_singulier, $regle[1], $mot); - $singulier=ereg_replace($pattern_pluriel, $regle[0], $mot); - if($singulier != $mot or $pluriel != $mot) break; - } - // Si inchangé on ajoute le S - if($singulier == $pluriel) - { - if(strRight($mot,1)=="S") {$pluriel=$singulier; $singulier=strLeft($singulier,strlen($singulier)-1);} - else $pluriel=$singulier."S"; - } - return array($singulier,$pluriel); - } - -// --------------------------------------------------- -// Rend true si mot inclu -// --------------------------------------------------- - public function isMotInclu($mot) - { - return in_array($mot, $this->inclu); - } - -// --------------------------------------------------- -// Othographe approchante -// --------------------------------------------------- function phonetix($sIn) { if (strlen($sIn)<4 || is_numeric($sIn)) return false; @@ -276,315 +43,6 @@ class indexation { ? static::$phonetixCache[$sIn] : static::$phonetixCache[$sIn] = $this->phonetixCompute($sIn); } - - function phonetixCompute($sIn) - { - //$sIn = utf8_decode($sIn); // Selon votre implémentation, vous aurez besoin de décoder ce qui arrive pour les caractères spéciaux - $sIn = strtr( $sIn, $this->accents); // minuscules accentuées ou composées en majuscules simples - $sIn = strtr( $sIn, $this->min2maj); // majuscules accentuées ou composées en majuscules simples - $sIn = strtoupper( $sIn ); // on passe tout le reste en majuscules - $sIn = preg_replace( '`[^A-Z]`', '', $sIn ); // on garde uniquement les lettres de A à Z - - $sBack=$sIn; // on sauve le code (utilisé pour les mots très courts) - - $sIn = preg_replace( '`O[O]+`', 'OU', $sIn ); // pré traitement OO... -> OU - $sIn = str_replace( 'SAOU', 'SOU', $sIn ); // pré traitement SAOU -> SOU - $sIn = str_replace( 'OES', 'OS', $sIn ); // pré traitement OES -> OS - $sIn = str_replace( 'CCH', 'K', $sIn ); // pré traitement CCH -> K - $sIn = preg_replace( '`CC([IYE])`', 'KS$1', $sIn ); // CCI CCY CCE - $sIn = preg_replace( '`(.)\1`', '$1', $sIn ); // supression des répétitions - - // quelques cas particuliers - if ($sIn=="CD") return($sIn); - if ($sIn=="BD") return($sIn); - if ($sIn=="BV") return($sIn); - if ($sIn=="TABAC") return("TABA"); - if ($sIn=="FEU") return("FE"); - if ($sIn=="FE") return($sIn); - if ($sIn=="FER") return($sIn); - if ($sIn=="FIEF") return($sIn); - if ($sIn=="FJORD") return($sIn); - if ($sIn=="GOAL") return("GOL"); - if ($sIn=="FLEAU") return("FLEO"); - if ($sIn=="HIER") return("IER"); - if ($sIn=="HEU") return("E"); - if ($sIn=="HE") return("E"); - if ($sIn=="OS") return($sIn); - if ($sIn=="RIZ") return("RI"); - if ($sIn=="RAZ") return("RA"); - - // pré-traitements - $sIn = preg_replace( '`OIN[GT]$`', 'OIN', $sIn ); // terminaisons OING -> OIN - $sIn = preg_replace( '`E[RS]$`', 'E', $sIn ); // supression des terminaisons infinitifs et participes pluriels - $sIn = preg_replace( '`(C|CH)OEU`', 'KE', $sIn ); // pré traitement OEU -> EU - $sIn = str_replace( 'MOEU', 'ME', $sIn ); // pré traitement OEU -> EU - $sIn = preg_replace( '`OE([UI]+)([BCDFGHJKLMNPQRSTVWXZ])`', 'E$1$2', $sIn ); // pré traitement OEU OEI -> E - $sIn = preg_replace( '`^GEN[TS]$`', 'JAN', $sIn ); // pré traitement GEN -> JAN - $sIn = str_replace( 'CUEI', 'KEI', $sIn ); // pré traitement accueil - $sIn = preg_replace( '`([^AEIOUYC])AE([BCDFGHJKLMNPQRSTVWXZ])`', '$1E$2', $sIn ); // pré traitement AE -> E - $sIn = preg_replace( '`AE([QS])`', 'E$1', $sIn ); // pré traitement AE -> E - $sIn = preg_replace( '`AIE([BCDFGJKLMNPQRSTVWXZ])`', 'AI$1', $sIn ); // pré-traitement AIE(consonne) -> AI - $sIn = str_replace( 'ANIEM', 'ANIM', $sIn ); // pré traitement NIEM -> NIM - $sIn = preg_replace( '`(DRA|TRO|IRO)P$`', '$1', $sIn ); // P terminal muet - $sIn = preg_replace( '`(LOM)B$`', '$1', $sIn ); // B terminal muet - $sIn = preg_replace( '`(RON|POR)C$`', '$1', $sIn ); // C terminal muet - $sIn = preg_replace( '`PECT$`', 'PET', $sIn ); // C terminal muet - $sIn = preg_replace( '`ECUL$`', 'CU', $sIn ); // L terminal muet - $sIn = preg_replace( '`(CHA|CA|E)M(P|PS)$`', '$1N', $sIn ); // P ou PS terminal muet - $sIn = preg_replace( '`(TAN|RAN)G$`', '$1', $sIn ); // G terminal muet - - - // sons YEUX - $sIn = preg_replace( '`([^VO])ILAG`', '$1IAJ', $sIn ); - $sIn = preg_replace( '`([^TRH])UIL(AR|E)(.+)`', '$1UI$2$3', $sIn ); - $sIn = preg_replace( '`([G])UIL([AEO])`', '$1UI$2', $sIn ); - $sIn = preg_replace( '`([NSPM])AIL([AEO])`', '$1AI$2', $sIn ); - $convMIn = array('DILAI','DILON','DILER','DILEM','RILON','TAILE','GAILET','AILAI','AILAR', - 'OUILA','EILAI','EILAR','EILER','EILEM','REILET','EILET','AILOL' ); - $convMOut = array( 'DIAI', 'DION','DIER', 'DIEM', 'RION', 'TAIE', 'GAIET', 'AIAI', 'AIAR', - 'OUIA', 'AIAI', 'AIAR', 'AIER', 'AIEM', 'RAIET', 'EIET', 'AIOL' ); - $sIn = str_replace( $convMIn, $convMOut, $sIn ); - $sIn = preg_replace( '`([^AEIOUY])(SC|S)IEM([EA])`', '$1$2IAM$3', $sIn ); // IEM -> IAM - $sIn = preg_replace( '`^(SC|S)IEM([EA])`', '$1IAM$2', $sIn ); // IEM -> IAM - - // MP MB -> NP NB - $convMIn = array( 'OMB', 'AMB', 'OMP', 'AMP', 'IMB', 'EMP','GEMB','EMB', 'UMBL','CIEN'); - $convMOut = array( 'ONB', 'ANB', 'ONP', 'ANP', 'INB', 'ANP','JANB','ANB', 'INBL','SIAN'); - $sIn = str_replace( $convMIn, $convMOut, $sIn ); - - // Sons en K - $sIn = preg_replace( '`^ECHO$`', 'EKO', $sIn ); // cas particulier écho - $sIn = preg_replace( '`^ECEUR`', 'EKEUR', $sIn ); // cas particulier écÅ“uré - // Choléra ChÅ“ur mais pas chocolat! - $sIn = preg_replace( '`^CH(OG+|OL+|OR+|EU+|ARIS|M+|IRO|ONDR)`', 'K$1', $sIn ); //En début de mot - $sIn = preg_replace( '`(YN|RI)CH(OG+|OL+|OC+|OP+|OM+|ARIS|M+|IRO|ONDR)`', '$1K$2', $sIn ); //Ou devant une consonne - $sIn = preg_replace( '`CHS`', 'CH', $sIn ); - $sIn = preg_replace( '`CH(AIQ)`', 'K$1', $sIn ); - $sIn = preg_replace( '`^ECHO([^UIPY])`', 'EKO$1', $sIn ); - $sIn = preg_replace( '`ISCH(I|E)`', 'ISK$1', $sIn ); - $sIn = preg_replace( '`^ICHT`', 'IKT', $sIn ); - $sIn = preg_replace( '`ORCHID`', 'ORKID', $sIn ); - $sIn = preg_replace( '`ONCHIO`', 'ONKIO', $sIn ); - $sIn = preg_replace( '`ACHIA`', 'AKIA', $sIn ); // retouche ACHIA -> AKIA - $sIn = preg_replace( '`([^C])ANICH`', '$1ANIK', $sIn ); // ANICH -> ANIK 1/2 - $sIn = preg_replace( '`OMANIK`', 'OMANICH', $sIn ); // cas particulier 2/2 - $sIn = preg_replace( '`ACHY([^D])`', 'AKI$1', $sIn ); - $sIn = preg_replace( '`([AEIOU])C([BDFGJKLMNPQRTVWXZ])`', '$1K$2', $sIn ); // voyelle, C, consonne sauf H - $convPrIn = array('EUCHA','YCHIA','YCHA','YCHO','YCHED','ACHEO','RCHEO','RCHES', - 'ECHN','OCHTO','CHORA','CHONDR','CHORE','MACHM','BRONCHO','LICHOS','LICHOC'); - $convPrOut = array('EKA', 'IKIA', 'IKA', 'IKO', 'IKED','AKEO','RKEO', 'RKES', - 'EKN', 'OKTO', 'KORA', 'KONDR' ,'KORE' ,'MAKM', 'BRONKO', 'LIKOS', 'LIKOC'); - $sIn = str_replace( $convPrIn, $convPrOut, $sIn ); - - // Weuh (perfectible) - $convPrIn = array( 'WA','WO', 'WI','WHI','WHY','WHA','WHO'); - $convPrOut = array( 'OI', 'O','OUI','OUI','OUI','OUA', 'OU'); - $sIn = str_replace( $convPrIn, $convPrOut, $sIn ); - - // Gueu, Gneu, Jeu et quelques autres - $convPrIn = array( 'GNES','GNET','GNER','GNE', 'GI', 'GNI','GNA','GNOU','GNUR','GY','OUGAIN', - 'AGEOL', 'AGEOT','GEOLO','GEOM','GEOP','GEOG','GEOS','GEORG','GEOR','NGEOT','UGEOT','GEOT','GEOD','GEOC','GEO','GEA','GE', - 'QU', 'Q', 'CY', 'CI', 'CN','ICM','CEAT','CE', - 'CR', 'CO', 'CUEI','CU', 'VENCA','CA', 'CS','CLEN','CL', 'CZ', 'CTIQ', - 'CTIF','CTIC','CTIS','CTIL','CTIO','CTI', 'CTU', 'CTE','CTO','CTR','CT', 'PH', 'TH', - 'OW', 'LH', 'RDL', 'CHLO', 'CHR', 'PTIA'); - $convPrOut = array( 'NIES','NIET','NIER', 'NE', 'JI', 'NI','NIA','NIOU','NIUR','JI','OUGIN', - 'AJOL', 'AJOT','JEOLO','JEOM','JEOP','JEOG','JEOS','JORJ','JEOR','NJOT','UJOT','JEOT','JEOD','JEOC', 'JO','JA' ,'JE', - 'K', 'K', 'SI', 'SI', 'KN','IKM', 'SAT','SE', - 'KR', 'KO', 'KEI','KU', 'VANSA','KA', 'KS','KLAN','KL', 'KZ', 'KTIK', - 'KTIF','KTIS','KTIS','KTIL','KSIO','KTI', 'KTU', 'KTE','KTO','KTR','KT', 'F', 'T', - 'OU', 'L', 'RL', 'KLO', 'KR', 'PSIA'); - $sIn = str_replace( $convPrIn, $convPrOut, $sIn ); - - $sIn = preg_replace( '`GU([^RLMBSTPZN])`', 'G$1', $sIn ); // Gueu ! - $sIn = preg_replace( '`GNO([MLTNRKG])`', 'NIO$1', $sIn ); // GNO ! Tout sauf S pour gnos - $sIn = preg_replace( '`GNO([MLTNRKG])`', 'NIO$1', $sIn ); // bis -> gnognotte! Si quelqu'un sait le faire en une seule regexp... - - - // TI -> SI v2.0 - $convPrIn = array( 'BUTIE','BUTIA','BATIA','ANTIEL','RETION','ENTIEL','ENTIAL','ENTIO','ENTIAI','UJETION','ATIEM','PETIEN', - 'CETIE','OFETIE','IPETI','LBUTION','BLUTION','LETION','LATION','SATIET'); - $convPrOut = array( 'BUSIE','BUSIA','BASIA','ANSIEL','RESION','ENSIEL','ENSIAL','ENSIO','ENSIAI','UJESION','ASIAM','PESIEN', - 'CESIE','OFESIE','IPESI','LBUSION','BLUSION','LESION','LASION','SASIET'); - $sIn = str_replace( $convPrIn, $convPrOut, $sIn ); - $sIn = preg_replace( '`(.+)ANTI(AL|O)`', '$1ANSI$2', $sIn ); // sauf antialcoolique, antialbumine, antialarmer, ... - $sIn = preg_replace( '`(.+)INUTI([^V])`', '$1INUSI$2', $sIn ); // sauf inutilité, inutilement, diminutive, ... - $sIn = preg_replace( '`([^O])UTIEN`', '$1USIEN', $sIn ); // sauf soutien, ... - $sIn = preg_replace( '`([^DE])RATI[E]$`', '$1RASI$2', $sIn ); // sauf xxxxxcratique, ... - // TIEN TION -> SIEN SION v3.1 - $sIn = preg_replace( '`([^SNEU]|KU|KO|RU|LU|BU|TU|AU)T(IEN|ION)`', '$1S$2', $sIn ); - - - // H muet - $sIn = preg_replace( '`([^CS])H`', '$1', $sIn ); // H muet - $sIn = str_replace( 'ESH', 'ES', $sIn ); // H muet - $sIn = str_replace( 'NSH', 'NS', $sIn ); // H muet - $sIn = str_replace( 'SH', 'CH', $sIn ); // ou pas! - - // NASALES - $convNasIn = array( 'OMT','IMB', 'IMP','UMD','TIENT','RIENT','DIENT','IEN', - 'YMU','YMO','YMA','YME', 'YMI','YMN','YM', 'AHO','FAIM','DAIM','SAIM','EIN','AINS'); - $convNasOut = array( 'ONT','INB', 'INP','OND','TIANT','RIANT','DIANT', 'IN', - 'IMU','IMO','IMA','IME', 'IMI','IMN','IN', 'AO', 'FIN','DIN', 'SIN','AIN','INS'); - $sIn = str_replace( $convNasIn, $convNasOut, $sIn ); - // AIN -> IN v2.0 - $sIn = preg_replace( '`AIN$`', 'IN', $sIn ); - $sIn = preg_replace( '`AIN([BTDK])`', 'IN$1', $sIn ); - // UN -> IN - $sIn = preg_replace( '`([^O])UND`', '$1IND', $sIn ); // aucun mot français ne commence par UND! - $sIn = preg_replace( '`([JTVLFMRPSBD])UN([^IAE])`', '$1IN$2', $sIn ); - $sIn = preg_replace( '`([JTVLFMRPSBD])UN$`', '$1IN', $sIn ); - $sIn = preg_replace( '`RFUM$`', 'RFIN', $sIn ); - $sIn = str_replace( 'LUMB', 'LINB', $sIn ); - // EN -> AN - $sIn = preg_replace( '`([^BCDFGHJKLMNPQRSTVWXZ])EN`', '$1AN', $sIn ); - $sIn = preg_replace( '`([VTLJMRPDSBFKNG])EN([BRCTDKZSVN])`', '$1AN$2', $sIn ); // deux fois pour les motifs recouvrants malentendu, pendentif, ... - $sIn = preg_replace( '`([VTLJMRPDSBFKNG])EN([BRCTDKZSVN])`', '$1AN$2', $sIn ); // si quelqu'un sait faire avec une seule regexp! - $sIn = preg_replace( '`^EN([BCDFGHJKLNPQRSTVXZ]|CH|IV|ORG|OB|UI|UA|UY)`', 'AN$1', $sIn ); - $sIn = preg_replace( '`(^[JRVTH])EN([DRTFGSVJMP])`', '$1AN$2', $sIn ); - $sIn = preg_replace( '`SEN([ST])`', 'SAN$1', $sIn ); - $sIn = preg_replace( '`^DESENIV`', 'DESANIV', $sIn ); - $sIn = preg_replace( '`([^M])EN(UI)`', '$1AN$2', $sIn ); - $sIn = preg_replace( '`(.+[JTVLFMRPSBD])EN([JLFDSTG])`', '$1AN$2', $sIn ); - // EI -> AI - $sIn = preg_replace( '`([VSBSTNRLPM])E[IY]([ACDFRJLGZ])`', '$1AI$2', $sIn ); - - // Histoire d'Ô - $convNasIn = array( 'EAU', 'EU', 'Y', 'EOI', 'JEA','OIEM','OUANJ','OUA','OUENJ'); - $convNasOut = array( 'O', 'E', 'I', 'OI', 'JA' ,'OIM' ,'OUENJ', 'OI','OUANJ'); - $sIn = str_replace( $convNasIn, $convNasOut, $sIn ); - $sIn = preg_replace( '`AU([^E])`', 'O$1', $sIn ); // AU sans E qui suit - - // Les retouches! - $sIn = preg_replace( '`^BENJ`', 'BINJ', $sIn ); // retouche BENJ -> BINJ - $sIn = str_replace( 'RTIEL', 'RSIEL', $sIn ); // retouche RTIEL -> RSIEL - $sIn = str_replace( 'PINK', 'PONK', $sIn ); // retouche PINK -> PONK - $sIn = str_replace( 'KIND', 'KOND', $sIn ); // retouche KIND -> KOND - $sIn = preg_replace( '`KUM(N|P)`', 'KON$1', $sIn ); // retouche KUMN KUMP - $sIn = str_replace( 'LKOU', 'LKO', $sIn ); // retouche LKOU -> LKO - $sIn = str_replace( 'EDBE', 'EBE', $sIn ); // retouche EDBE pied-bÅ“uf - $sIn = str_replace( 'ARCM', 'ARKM', $sIn ); // retouche SCH -> CH - $sIn = str_replace( 'SCH', 'CH', $sIn ); // retouche SCH -> CH - $sIn = preg_replace( '`^OINI`', 'ONI', $sIn ); // retouche début OINI -> ONI - $sIn = preg_replace( '`([^NDCGRHKO])APT`', '$1AT', $sIn ); // retouche APT -> AT - $sIn = preg_replace( '`([L]|KON)PT`', '$1T', $sIn ); // retouche LPT -> LT - $sIn = str_replace( 'OTB', 'OB', $sIn ); // retouche OTB -> OB (hautbois) - $sIn = str_replace( 'IXA', 'ISA', $sIn ); // retouche IXA -> ISA - $sIn = str_replace( 'TG', 'G', $sIn ); // retouche TG -> G - $sIn = preg_replace( '`^TZ`', 'TS', $sIn ); // retouche début TZ -> TS - $sIn = str_replace( 'PTIE', 'TIE', $sIn ); // retouche PTIE -> TIE - $sIn = str_replace( 'GT', 'T', $sIn ); // retouche GT -> T - $sIn = str_replace( 'ANKIEM', 'ANKILEM', $sIn ); // retouche tranquillement - $sIn = preg_replace( "`(LO|RE)KEMAN`", "$1KAMAN", $sIn ); // KEMAN -> KAMAN - $sIn = preg_replace( '`NT(B|M)`', 'N$1', $sIn ); // retouche TB -> B TM -> M - $sIn = str_replace( 'GSU', 'SU', $sIn ); // retouche GS -> SU - $sIn = str_replace( 'ESD', 'ED', $sIn ); // retouche ESD -> ED - $sIn = str_replace( 'LESKEL', 'LEKEL', $sIn ); // retouche LESQUEL -> LEKEL - $sIn = str_replace( 'CK', 'K', $sIn ); // retouche CK -> K - - // Terminaisons - $sIn = preg_replace( '`USIL$`', 'USI', $sIn ); // terminaisons USIL -> USI - $sIn = preg_replace( '`X$|[TD]S$|[DS]$`', '', $sIn ); // terminaisons TS DS LS X T D S... v2.0 - $sIn = preg_replace( '`([^KL]+)T$`', '$1', $sIn ); // sauf KT LT terminal - $sIn = preg_replace( '`^[H]`', '', $sIn ); // H pseudo muet en début de mot, je sais, ce n'est pas une terminaison - $sBack2=$sIn; // on sauve le code (utilisé pour les mots très courts) - - $convPartIn = [ - '`TIL$`', // terminaisons TIL -> TI - '`LC$`', // terminaisons LC -> LK - '`L[E]?[S]?$`', // terminaisons LE LES -> L - '`(.+)N[E]?[S]?$`', // terminaisons NE NES -> N - '`EZ$`', // terminaisons EZ -> E - '`OIG$`', // terminaisons OIG -> OI - '`OUP$`', // terminaisons OUP -> OU - '`([^R])OM$`', // terminaisons OM -> ON sauf ROM - '`LOP$`', // terminaisons LOP -> LO - '`NTANP$`', // terminaisons NTANP -> NTAN - '`TUN$`', // terminaisons TUN -> TIN - '`AU$`', // terminaisons AU -> O - '`EI$`', // terminaisons EI -> AI - '`R[DG]$`', // terminaisons RD RG -> R - '`ANC$`', // terminaisons ANC -> AN - '`KROC$`', // terminaisons C muet de CROC, ESCROC - '`HOUC$`', // terminaisons C muet de CAOUTCHOUC - '`OMAC$`', // terminaisons C muet de ESTOMAC (mais pas HAMAC) - '`([J])O([NU])[CG]$`',// terminaisons C et G muet de OUC ONC OUG - '`([^GTR])([AO])NG$`',// terminaisons G muet ANG ONG sauf GANG GONG TANG TONG - '`UC$`', // terminaisons UC -> UK - '`AING$`', // terminaisons AING -> IN - '`([EISOARN])C$`', // terminaisons C -> K - '`([ABD-MO-Z]+)[EH]+$`', // terminaisons E ou H sauf pour C et N - '`EN$`', // terminaisons EN -> AN (difficile à faire avant sans avoir des soucis) Et encore, - '`(NJ)EN$`',// terminaisons EN -> AN - '`^PAIEM`', // PAIE -> PAI - '`([^NTB])EF$`', // F muet en fin de mot - '`(.)\1`' // supression des répétitions (suite à certains remplacements) - ]; - - $convPartOut = [ - 'TI', // terminaisons TIL -> TI - 'LK', // terminaisons LC -> LK - 'L', // terminaisons LE LES -> L - '$1N', // terminaisons NE NES -> N - 'E', // terminaisons EZ -> E - 'OI', // terminaisons OIG -> OI - 'OU', // terminaisons OUP -> OU - '$1ON', // terminaisons OM -> ON sauf ROM - 'LO', // terminaisons LOP -> LO - 'NTAN', // terminaisons NTANP -> NTAN - 'TIN', // terminaisons TUN -> TIN - 'O', // terminaisons AU -> O - 'AI', // terminaisons EI -> AI - 'R', // terminaisons RD RG -> R - 'AN', // terminaisons ANC -> AN - 'KRO', // terminaisons C muet de CROC, ESCROC - 'HOU', // terminaisons C muet de CAOUTCHOUC - 'OMA', // terminaisons C muet de ESTOMAC (mais pas HAMAC) - '$1O$2',// terminaisons C et G muet de OUC ONC OUG - '$1$2N',// terminaisons G muet ANG ONG sauf GANG GONG TANG TONG - 'UK', // terminaisons UC -> UK - 'IN', // terminaisons AING -> IN - '$1K', // terminaisons C -> K - '$1', // terminaisons E ou H sauf pour C et N - 'AN', // terminaisons EN -> AN (difficile à faire avant sans avoir des soucis) Et encore, c'est pas top! - '$1AN', // terminaisons EN -> AN - 'PAIM', // PAIE -> PAI - '\1', // F muet en fin de mot - '$1' // supression des répétitions (suite à certains remplacements) - ]; - - $sIn = preg_replace( $convPartIn, $convPartOut, $sIn ); - - // cas particuliers, bah au final, je n'en ai qu'un ici - $convPartIn = array( 'FUEL'); - $convPartOut = array( 'FIOUL'); - $sIn = str_replace( $convPartIn, $convPartOut, $sIn ); - - // Ce sera le seul code retourné à une seule lettre! - if ($sIn=='O') return($sIn); - - // seconde chance sur les mots courts qui ont souffert de la simplification - if (strlen($sIn)<2) - { - // Sigles ou abréviations - if (preg_match("`[BCDFGHJKLMNPQRSTVWXYZ][BCDFGHJKLMNPQRSTVWXYZ][BCDFGHJKLMNPQRSTVWXYZ][BCDFGHJKLMNPQRSTVWXYZ]*`",$sBack)) - return($sBack); - - if (preg_match("`[RFMLVSPJDF][AEIOU]`",$sBack)) - { - if (strlen($sBack)==3) - return(substr($sBack,0,2));// mots de trois lettres supposés simples - if (strlen($sBack)==4) - return(substr($sBack,0,3));// mots de quatre lettres supposés simples - } - - if (strlen($sBack2)>1) return $sBack2; - } - if (strlen($sIn)>1) - { - return substr($sIn,0,16); // Je limite à 16 caractères mais vous faites comme vous voulez! - } - else return ''; - } } + ?> \ No newline at end of file diff --git a/library/Class/Indexation.php b/library/Class/Indexation.php index d0d7c26733201f249b70e280c623bb59527a1d94..7499a09870e0d9bd7b5deee4c4a767ca52942d62 100644 --- a/library/Class/Indexation.php +++ b/library/Class/Indexation.php @@ -1,4 +1,4 @@ -<?PHP +<?php /** * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved. * @@ -18,10 +18,6 @@ * along with BOKEH; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -//////////////////////////////////////////////////////////////////////// -// OPAC3 : CALCUL DES INDEX -/////////////////////////////////////////////////////////////////////// - class Class_Indexation { protected static $_instance; @@ -30,7 +26,18 @@ class Class_Indexation { private $inclu; // Mots inclus private $exclu; // Mots vides private $pluriel; // Règles des pluriels - private $tableMaj; // Table de transco pour majuscules + private $tableMajFrom, $tableMajTo = []; // Table de transco pour majuscules + private $tableMajUtf8; // Table de transco pour majuscules accentuées utf8 + + private $accents = ['É' => 'E', 'È' => 'E', 'Ë' => 'E', 'Ê' => 'E','Ã' => 'A', 'À' => 'A', 'Ä' => 'A', 'Â' => 'A', + 'Ã…' => 'A', 'Ã' => 'A', 'Æ' => 'E','Ã' => 'I', 'ÃŽ' => 'I', 'ÃŒ' => 'I', 'Ã' => 'I', + 'Ô' => 'O', 'Ö' => 'O', 'Ã’' => 'O', 'Ó' => 'O', 'Õ' => 'O', 'Ø' => 'O', 'Å’' => 'OEU', + 'Ú' => 'U', 'Ù' => 'U', 'Û' => 'U', 'Ãœ' => 'U','Ñ' => 'N', 'Ç' => 'S', '¿' => 'E']; + + private $min2maj = ['é' => 'É', 'è' => 'È', 'ë' => 'Ë', 'ê' => 'Ê','á' => 'Ã', 'â' => 'Â', 'à ' => 'À', 'Ä' => 'A', + 'Â' => 'A', 'Ã¥' => 'Ã…', 'ã' => 'Ã', 'æ' => 'Æ', 'ï' => 'Ã', 'î' => 'ÃŽ', 'ì' => 'ÃŒ', 'Ã' => 'Ã', + 'ô' => 'Ô', 'ö' => 'Ö', 'ò' => 'Ã’', 'ó' => 'Ó','õ' => 'Õ', 'ø' => 'Ø', 'Å“' => 'Å’', + 'ú' => 'Ú', 'ù' => 'Ù', 'û' => 'Û', 'ü' => 'Ãœ','ç' => 'Ç', 'ñ' => 'Ñ', 'ß' => 'S']; public static function getInstance() { @@ -39,7 +46,8 @@ class Class_Indexation { return static::$_instance; } - public function __construct() { + + function __construct() { // Lire formes rejetées $this->articles=array("L'","LE ","LA ","LES ","UN ","UNE "); $this->inclu=array("AN","AS","OR","U2","AI","LU","XO","DO","RE","MI","FA","SI","AC","DC","XX","B","C","D","E","F","G","H","I","J","K","M","P","Q","R","S","T","V","W","X","Y","Z","L","YU","UT","LI","OC","PI","ZU","WU","TO","OZ","ZZ","XX"); @@ -47,241 +55,235 @@ class Class_Indexation { // Pluriels $this->pluriel=array( - array("AIL","AULX"), - array("AVAL","AVALS"), - array("BAIL","BAUX"), - array("BAL","BALS"), - array("BANAL","BANALS"), - array("BANCAL","BANCALS"), - array("BIJOU","BIJOUX"), - array("BLEU","BLEUS"), - array("CAILLOU","CAILLOUX"), - array("CAL","CALS"), - array("CARNAVAL","CARNAVALS"), - array("CEREMONIAL","CEREMONIALS"), - array("CHACAL","CHACALS"), - array("CHORAL","CHORALS"), - array("CHOU","CHOUX"), - array("CORAIL","CORAUX"), - array("DETAIL","DETAILS"), - array("EMAIL","EMAUX"), - array("EMEU","EMEUS"), - array("ETAL","ETALS"), - array("FATAL","FATALS"), - array("FESTIVAL","FESTIVALS"), - array("GEMMAIL","GEMMAUX"), - array("GENOU","GENOUX"), - array("HIBOU","HIBOUX"), - array("JOUJOU","JOUJOUX"), - array("LANDAU","LANDAUX"), - array("NATAL","NATALS"), - array("OEIL","YEUX"), - array("PAL","PALS"), - array("PNEU","PNEUS"), - array("POU","POUX"), - array("RECITAL","RECITALS"), - array("REGAL","REGALS"), - array("SARRAU","SARRAUS"), - array("SOUPIRAIL","SOUPIRAUX"), - array("TONAL","TONALS"), - array("TRAVAIL","TRAVAUX"), - array("VAL","VALS"), - array("VENTAIL","VENTAUX"), - array("VIRGINAL","VIRGINALS"), - array("VITRAIL","VITRAUX"), - array("*EAU","*EAUX"), - array("*AL","*AUX"), - array("*EU","*EUX"), - array("*AU","*AUX") - ); + array("AIL","AULX"), + array("AVAL","AVALS"), + array("BAIL","BAUX"), + array("BAL","BALS"), + array("BANAL","BANALS"), + array("BANCAL","BANCALS"), + array("BIJOU","BIJOUX"), + array("BLEU","BLEUS"), + array("CAILLOU","CAILLOUX"), + array("CAL","CALS"), + array("CARNAVAL","CARNAVALS"), + array("CEREMONIAL","CEREMONIALS"), + array("CHACAL","CHACALS"), + array("CHORAL","CHORALS"), + array("CHOU","CHOUX"), + array("CORAIL","CORAUX"), + array("DETAIL","DETAILS"), + array("EMAIL","EMAUX"), + array("EMEU","EMEUS"), + array("ETAL","ETALS"), + array("FATAL","FATALS"), + array("FESTIVAL","FESTIVALS"), + array("GEMMAIL","GEMMAUX"), + array("GENOU","GENOUX"), + array("HIBOU","HIBOUX"), + array("JOUJOU","JOUJOUX"), + array("LANDAU","LANDAUX"), + array("NATAL","NATALS"), + array("OEIL","YEUX"), + array("PAL","PALS"), + array("PNEU","PNEUS"), + array("POU","POUX"), + array("RECITAL","RECITALS"), + array("REGAL","REGALS"), + array("SARRAU","SARRAUS"), + array("SOUPIRAIL","SOUPIRAUX"), + array("TONAL","TONALS"), + array("TRAVAIL","TRAVAUX"), + array("VAL","VALS"), + array("VENTAIL","VENTAUX"), + array("VIRGINAL","VIRGINALS"), + array("VITRAIL","VITRAUX"), + array("*EAU","*EAUX"), + array("*AL","*AUX"), + array("*EU","*EUX"), + array("*AU","*AUX") + ); // Init table ascii pour majuscules - $this->tableMaj = str_repeat( " ", 41 ) - . "* 0123456789 " - . "ABCDEFGHIJKLMNOPQRSTUVWXYZ " - . "ABCDEFGHIJKLMNOPQRSTUVWXYZ " - . str_repeat( " ", 63) - ."AAAAAAACEEEEIIII NOOOOO UUUUY AAAAAAACEEEEIIII NOOOOO UUUUY Y"; - } + $this->tableMajTo = str_split(str_repeat( " ", 42 ) + . "* 0123456789 " + . "ABCDEFGHIJKLMNOPQRSTUVWXYZ " + . "ABCDEFGHIJKLMNOPQRSTUVWXYZ " + . str_repeat( " ", 63) + ."AAAAAAACEEEEIIII NOOOOO UUUUY AAAAAAACEEEEIIII NOOOOO UUUUY Y"); - public function getClefAlpha($type_doc, $titre, $complement_titre, $auteur, $tome, $editeur, $annee) { - $clef = $this->getClefOeuvre($titre, $complement_titre, $auteur, $tome) . '-'; - $clef .= substr($this->alphaMaj(str_replace(' ', '', $editeur)), 0, 80) . '-'; - $clef .= $annee . '-'; - $clef .= $type_doc; - return str_replace(' ', '', $clef); - } + for($i=0; $i<count($this->tableMajTo); $i++) + $this->tableMajFrom[] = chr($i); - public function getClefOeuvre($titre, $complement_titre, $auteur, $tome) { - $clef = substr($this->codeAlphaTitre(strtoupper(str_replace(" ","",$titre))),0,80)."-"; - $clef .= substr($this->codeAlphaTitre(strtoupper(str_replace(" ","",$complement_titre))),0,20)."-"; - $clef .= substr($this->alphaMaj(str_replace(' ', '',$auteur)),0,80) . "-"; - $clef .= $this->alphaMaj($tome); - $clef = str_replace(' ', '', $clef); - return $clef; + $this->tableMajUtf8=array(chr(0xC9) => 'E', 'È' => 'E', 'Ë' => 'E', 'Ê' => 'E','Ã' => 'A', 'À' => 'A', 'Ä' => 'A', 'Â' => 'A', + 'Ã…' => 'A', 'Ã' => 'A', 'Æ' => 'E','Ã' => 'I', 'ÃŽ' => 'I', 'ÃŒ' => 'I', 'Ã' => 'I', + 'Ô' => 'O', 'Ö' => 'O', 'Ã’' => 'O', 'Ó' => 'O', 'Õ' => 'O', 'Ø' => 'O', 'Å’' => 'OEU', + 'Ú' => 'U', 'Ù' => 'U', 'Û' => 'U', 'Ãœ' => 'U','Ñ' => 'N', 'Ç' => 'S', '¿' => 'E'); } - - // Indexation d'un titre - public function codeAlphaTitre($titre) { - $titre = $this->alphaMaj($titre); - foreach($this->articles as $article) { - $lg = strlen($article); - if (strLeft($titre, $lg)==$article) { - $titre = strMid($titre,$lg,256); - break; + public function codeAlphaTitre($titre) + { + $titre=$this->alphaMaj($titre); + foreach($this->articles as $article) + { + $lg=strlen($article); + if(strLeft($titre, $lg)==$article) {$titre=strMid($titre,$lg,256); break;} } - } $titre=$this->alphaMaj($titre); return $titre; } - /** Rend une suite de mots complete pour les formes plurielles */ - public function getExpressionRecherche($mot) { - $mot = trim($mot); - if (!$mot) - return false; + // Rend une suite de mots complete pour les formes plurielles + public function getExpressionRecherche($mot) + { + $mot=trim($mot); + if(!$mot) return false; // Pluriel - $etoile = ''; - if (strRight($mot,1) == "*") { - $etoile = "*"; - $mot = strLeft($mot, strlen($mot)-1); - } - - $m = $this->getPluriel($mot); - $m[2] = $this->phonetix($m[0]); - $ret = "(" . $m[0] . $etoile . " " . $m[1] . " " . $m[2] . ")"; + if(strRight($mot,1) == "*") {$etoile="*";$mot=strLeft($mot, strlen($mot)-1);} + $m=$this->getPluriel($mot); + $m[2]=$this->phonetix($m[0]); + $ret="(".$m[0].$etoile." ".$m[1]." ".$m[2].")"; return trim($ret); } - /** Transformation en majuscules */ - public function alphaMaj($chaine) { - return iconv("UTF-8", "ascii//TRANSLIT", strtoupper($chaine)); - $chaine = utf8_decode($chaine); - $new = ''; - for ($i=0; $i < strLen($chaine); $i++) { - $car = $chaine[$i]; - $ascii = ord($car); - $car = $this->tableMaj[$ascii -1]; - $new = $new . $car; - } - return trim($new); + + public function alphaMaj( $chaine ) { + return trim(str_replace($this->tableMajFrom, + $this->tableMajTo, + utf8_decode($chaine))); + } + + + public function getClefAlpha($type_doc,$titre,$complement_titre,$auteur,$tome,$editeur,$annee) + { + $clef=$this->getClefOeuvre($titre,$complement_titre,$auteur,$tome)."-"; + $clef.=substr($this->alphaMaj(str_replace(" ","",$editeur)),0,80)."-"; + $clef.=$annee."-"; + $clef.=$type_doc; + $clef=str_replace(" ","",$clef); + return $clef; } +// Rend une clef alpha pour les oeuvres + public function getClefOeuvre($titre,$complement_titre,$auteur,$tome) + { + $clef = substr($this->codeAlphaTitre(strtoupper(str_replace(" ","",$titre))),0,80)."-"; + $clef.=substr($this->codeAlphaTitre(strtoupper(str_replace(" ","",$complement_titre))),0,20)."-"; + $clef.=substr($this->alphaMaj(str_replace(" ","",$auteur)),0,80)."-"; + $clef.=$this->alphaMaj($tome); + $clef=str_replace(" ","",$clef); + return $clef; + } - /** Decoupe une expression en mots en tenant compte des exclusions / inclusions */ - public function getMots($chaine) { - $new = []; - $chaine = str_replace(".", "", $chaine); +// Decoupe une expression en mots en tenant compte des exclusions / inclusions + public function getMots( $chaine ) + { + $new=array(); + $chaine = str_replace( ".", "", $chaine); $chaine = trim($this->alphaMaj($chaine)); - $mot = explode(" ", $chaine); + $mot = explode( " ", $chaine ); $index = 0; - for($i = 0; $i < count($mot); $i++) { - // Retirer mots de 2 lettres sauf les inclus et les nombres - if (strLen($mot[$i]) < 3 and intVal($mot[$i]) == false) { - if (in_array( $mot[$i], $this->inclu) == false) continue; - if (strlen($mot[$i])==1) $mot[$i] .= '00'; // mots d'1 lettre : on rajoute 00 + for( $i = 0; $i < count($mot); $i++) + { + // Retirer mots de 2 lettres sauf les inclus et les nombres + if( strLen($mot[$i]) < 3 And intVal($mot[$i])==false) + { + if( in_array( $mot[$i], $this->inclu) == false) continue; + if(strlen($mot[$i])==1) $mot[$i].="00"; // mots d'1 lettre : on double la lettre + } + // Retirer mots vides + if( in_array($mot[$i], $this->exclu ) == true ) continue; + // On garde le mot + $new[$index++] = $mot[$i]; } - // Retirer mots vides - if (in_array($mot[$i], $this->exclu)) continue; - - // On garde le mot - $new[$index++] = $mot[$i]; - } return $new; } - /** Rend une chaine de mots dedoublonnes et filtres */ +// Rend une chaine de mots dedoublonnes et filtres public function getFulltext($data) { - if (gettype($data) != 'array') - $data = array($data); - - $new = ''; - foreach($data as $chaine) { - $mots = $this->getMots($chaine); - foreach($mots as $mot) { - $mot = " " . $mot . " "; - if (strpos($new, $mot) === false) - $new .= $mot; + if (gettype($data) != "array") + $data=array($data); + + $new=" "; + foreach($data as $chaine) + { + $mots=$this->getMots($chaine); + foreach($mots as $mot) + { + $mot=" ".$mot." "; + if(strpos($new,$mot) === false ) + { + $new.=trim($mot)." "; + $phonem=" ".$this->phonetix(trim($mot))." "; + if($phonem and strpos($new,$phonem) === false ) $new.=trim($phonem)." "; + } + } } - } return trim($new); } - /** - * Rend le mot au singulier et au pluriel - */ - public function getPluriel($mot) { - if (strToUpper($mot) != $mot) - $mot = $this->alphaMaj($mot); - if (!trim($mot)) - return false; - - foreach($this->pluriel as $regle) { - if(strLeft($regle[0],1) != "*") { - if($mot==$regle[0] or $mot==$regle[1]) return $regle; - else continue; +// Rend le mot au singulier et au pluriel + public function getPluriel( $mot ) + { + if( strToUpper($mot) != $mot ) $mot=$this->alphaMaj($mot); + if(!trim($mot)) return false; + foreach($this->pluriel as $regle) + { + if(strLeft($regle[0],1) != "*") + { + if($mot==$regle[0] or $mot==$regle[1]) return $regle; + else continue; + } + $regle[0]=str_replace("*","",$regle[0]); + $regle[1]=str_replace("*","",$regle[1]); + $pattern_singulier = "(".$regle[0]."$)"; + $pattern_pluriel="(".$regle[1]."$)"; + + $pluriel=ereg_replace($pattern_singulier, $regle[1], $mot); + $singulier=ereg_replace($pattern_pluriel, $regle[0], $mot); + if($singulier != $mot or $pluriel != $mot) break; } - - $regle[0] = str_replace("*", "", $regle[0]); - $regle[1] = str_replace("*", "", $regle[1]); - $pattern_singulier = "(".$regle[0]."$)"; - $pattern_pluriel = "(".$regle[1]."$)"; - - $pluriel = preg_replace($pattern_singulier, $regle[1], $mot); - $singulier = preg_replace($pattern_pluriel, $regle[0], $mot); - if ($singulier != $mot or $pluriel != $mot) break; - } - // Si inchangé on ajoute le S - if ($singulier == $pluriel) { - if (strRight($mot,1)=="S") { - $pluriel = $singulier; - $singulier = strLeft($singulier,strlen($singulier)-1); - } else { - $pluriel=$singulier."S"; + if($singulier == $pluriel) + { + if(strRight($mot,1)=="S") {$pluriel=$singulier; $singulier=strLeft($singulier,strlen($singulier)-1);} + else $pluriel=$singulier."S"; } - - } return array($singulier,$pluriel); } - - public function isMotInclu($mot) { +// --------------------------------------------------- +// Rend true si mot inclu +// --------------------------------------------------- + public function isMotInclu($mot) + { return in_array($mot, $this->inclu); } - - public function phonetix($sIn) { - if (strlen($sIn) < 4) +// --------------------------------------------------- +// Othographe approchante +// --------------------------------------------------- + function phonetix($sIn) { + if (strlen($sIn)<4 || is_numeric($sIn)) return false; + return $this->phonetixCompute($sIn); + } - - $accents = array('É' => 'E', 'È' => 'E', 'Ë' => 'E', 'Ê' => 'E','Ã' => 'A', 'À' => 'A', 'Ä' => 'A', 'Â' => 'A', - 'Ã…' => 'A', 'Ã' => 'A', 'Æ' => 'E','Ã' => 'I', 'ÃŽ' => 'I', 'ÃŒ' => 'I', 'Ã' => 'I', - 'Ô' => 'O', 'Ö' => 'O', 'Ã’' => 'O', 'Ó' => 'O', 'Õ' => 'O', 'Ø' => 'O', 'Å’' => 'OEU', - 'Ú' => 'U', 'Ù' => 'U', 'Û' => 'U', 'Ãœ' => 'U','Ñ' => 'N', 'Ç' => 'S', '¿' => 'E'); - - $min2maj = array('é' => 'É', 'è' => 'È', 'ë' => 'Ë', 'ê' => 'Ê','á' => 'Ã', 'â' => 'Â', 'à ' => 'À', 'Ä' => 'A', - 'Â' => 'A', 'Ã¥' => 'Ã…', 'ã' => 'Ã', 'æ' => 'Æ', 'ï' => 'Ã', 'î' => 'ÃŽ', 'ì' => 'ÃŒ', 'Ã' => 'Ã', - 'ô' => 'Ô', 'ö' => 'Ö', 'ò' => 'Ã’', 'ó' => 'Ó','õ' => 'Õ', 'ø' => 'Ø', 'Å“' => 'Å’', - 'ú' => 'Ú', 'ù' => 'Ù', 'û' => 'Û', 'ü' => 'Ãœ','ç' => 'Ç', 'ñ' => 'Ñ', 'ß' => 'S'); - - + function phonetixCompute($sIn) + { //$sIn = utf8_decode($sIn); // Selon votre implémentation, vous aurez besoin de décoder ce qui arrive pour les caractères spéciaux - $sIn = strtr( $sIn, $min2maj); // minuscules accentuées ou composées en majuscules simples - $sIn = strtr( $sIn, $accents); // majuscules accentuées ou composées en majuscules simples + $sIn = strtr( $sIn, $this->accents); // minuscules accentuées ou composées en majuscules simples + $sIn = strtr( $sIn, $this->min2maj); // majuscules accentuées ou composées en majuscules simples $sIn = strtoupper( $sIn ); // on passe tout le reste en majuscules $sIn = preg_replace( '`[^A-Z]`', '', $sIn ); // on garde uniquement les lettres de A à Z $sBack=$sIn; // on sauve le code (utilisé pour les mots très courts) $sIn = preg_replace( '`O[O]+`', 'OU', $sIn ); // pré traitement OO... -> OU - $sIn = preg_replace( '`SAOU`', 'SOU', $sIn ); // pré traitement SAOU -> SOU - $sIn = preg_replace( '`OES`', 'OS', $sIn ); // pré traitement OES -> OS - $sIn = preg_replace( '`CCH`', 'K', $sIn ); // pré traitement CCH -> K + $sIn = str_replace( 'SAOU', 'SOU', $sIn ); // pré traitement SAOU -> SOU + $sIn = str_replace( 'OES', 'OS', $sIn ); // pré traitement OES -> OS + $sIn = str_replace( 'CCH', 'K', $sIn ); // pré traitement CCH -> K $sIn = preg_replace( '`CC([IYE])`', 'KS$1', $sIn ); // CCI CCY CCE $sIn = preg_replace( '`(.)\1`', '$1', $sIn ); // supression des répétitions @@ -308,14 +310,14 @@ class Class_Indexation { $sIn = preg_replace( '`OIN[GT]$`', 'OIN', $sIn ); // terminaisons OING -> OIN $sIn = preg_replace( '`E[RS]$`', 'E', $sIn ); // supression des terminaisons infinitifs et participes pluriels $sIn = preg_replace( '`(C|CH)OEU`', 'KE', $sIn ); // pré traitement OEU -> EU - $sIn = preg_replace( '`MOEU`', 'ME', $sIn ); // pré traitement OEU -> EU + $sIn = str_replace( 'MOEU', 'ME', $sIn ); // pré traitement OEU -> EU $sIn = preg_replace( '`OE([UI]+)([BCDFGHJKLMNPQRSTVWXZ])`', 'E$1$2', $sIn ); // pré traitement OEU OEI -> E $sIn = preg_replace( '`^GEN[TS]$`', 'JAN', $sIn ); // pré traitement GEN -> JAN - $sIn = preg_replace( '`CUEI`', 'KEI', $sIn ); // pré traitement accueil + $sIn = str_replace( 'CUEI', 'KEI', $sIn ); // pré traitement accueil $sIn = preg_replace( '`([^AEIOUYC])AE([BCDFGHJKLMNPQRSTVWXZ])`', '$1E$2', $sIn ); // pré traitement AE -> E $sIn = preg_replace( '`AE([QS])`', 'E$1', $sIn ); // pré traitement AE -> E $sIn = preg_replace( '`AIE([BCDFGJKLMNPQRSTVWXZ])`', 'AI$1', $sIn ); // pré-traitement AIE(consonne) -> AI - $sIn = preg_replace( '`ANIEM`', 'ANIM', $sIn ); // pré traitement NIEM -> NIM + $sIn = str_replace( 'ANIEM', 'ANIM', $sIn ); // pré traitement NIEM -> NIM $sIn = preg_replace( '`(DRA|TRO|IRO)P$`', '$1', $sIn ); // P terminal muet $sIn = preg_replace( '`(LOM)B$`', '$1', $sIn ); // B terminal muet $sIn = preg_replace( '`(RON|POR)C$`', '$1', $sIn ); // C terminal muet @@ -330,10 +332,10 @@ class Class_Indexation { $sIn = preg_replace( '`([^TRH])UIL(AR|E)(.+)`', '$1UI$2$3', $sIn ); $sIn = preg_replace( '`([G])UIL([AEO])`', '$1UI$2', $sIn ); $sIn = preg_replace( '`([NSPM])AIL([AEO])`', '$1AI$2', $sIn ); - $convMIn = array("DILAI","DILON","DILER","DILEM","RILON","TAILE","GAILET","AILAI","AILAR", - "OUILA","EILAI","EILAR","EILER","EILEM","REILET","EILET","AILOL" ); - $convMOut = array( "DIAI", "DION","DIER", "DIEM", "RION", "TAIE", "GAIET", "AIAI", "AIAR", - "OUIA", "AIAI", "AIAR", "AIER", "AIEM", "RAIET", "EIET", "AIOL" ); + $convMIn = array('DILAI','DILON','DILER','DILEM','RILON','TAILE','GAILET','AILAI','AILAR', + 'OUILA','EILAI','EILAR','EILER','EILEM','REILET','EILET','AILOL' ); + $convMOut = array( 'DIAI', 'DION','DIER', 'DIEM', 'RION', 'TAIE', 'GAIET', 'AIAI', 'AIAR', + 'OUIA', 'AIAI', 'AIAR', 'AIER', 'AIEM', 'RAIET', 'EIET', 'AIOL' ); $sIn = str_replace( $convMIn, $convMOut, $sIn ); $sIn = preg_replace( '`([^AEIOUY])(SC|S)IEM([EA])`', '$1$2IAM$3', $sIn ); // IEM -> IAM $sIn = preg_replace( '`^(SC|S)IEM([EA])`', '$1IAM$2', $sIn ); // IEM -> IAM @@ -362,9 +364,9 @@ class Class_Indexation { $sIn = preg_replace( '`ACHY([^D])`', 'AKI$1', $sIn ); $sIn = preg_replace( '`([AEIOU])C([BDFGJKLMNPQRTVWXZ])`', '$1K$2', $sIn ); // voyelle, C, consonne sauf H $convPrIn = array('EUCHA','YCHIA','YCHA','YCHO','YCHED','ACHEO','RCHEO','RCHES', - 'ECHN','OCHTO','CHORA','CHONDR','CHORE','MACHM','BRONCHO','LICHOS','LICHOC'); + 'ECHN','OCHTO','CHORA','CHONDR','CHORE','MACHM','BRONCHO','LICHOS','LICHOC'); $convPrOut = array('EKA', 'IKIA', 'IKA', 'IKO', 'IKED','AKEO','RKEO', 'RKES', - 'EKN', 'OKTO', 'KORA', 'KONDR' ,'KORE' ,'MAKM', 'BRONKO', 'LIKOS', 'LIKOC'); + 'EKN', 'OKTO', 'KORA', 'KONDR' ,'KORE' ,'MAKM', 'BRONKO', 'LIKOS', 'LIKOC'); $sIn = str_replace( $convPrIn, $convPrOut, $sIn ); // Weuh (perfectible) @@ -374,17 +376,17 @@ class Class_Indexation { // Gueu, Gneu, Jeu et quelques autres $convPrIn = array( 'GNES','GNET','GNER','GNE', 'GI', 'GNI','GNA','GNOU','GNUR','GY','OUGAIN', - 'AGEOL', 'AGEOT','GEOLO','GEOM','GEOP','GEOG','GEOS','GEORG','GEOR','NGEOT','UGEOT','GEOT','GEOD','GEOC','GEO','GEA','GE', - 'QU', 'Q', 'CY', 'CI', 'CN','ICM','CEAT','CE', - 'CR', 'CO', 'CUEI','CU', 'VENCA','CA', 'CS','CLEN','CL', 'CZ', 'CTIQ', - 'CTIF','CTIC','CTIS','CTIL','CTIO','CTI', 'CTU', 'CTE','CTO','CTR','CT', 'PH', 'TH', - 'OW', 'LH', 'RDL', 'CHLO', 'CHR', 'PTIA'); + 'AGEOL', 'AGEOT','GEOLO','GEOM','GEOP','GEOG','GEOS','GEORG','GEOR','NGEOT','UGEOT','GEOT','GEOD','GEOC','GEO','GEA','GE', + 'QU', 'Q', 'CY', 'CI', 'CN','ICM','CEAT','CE', + 'CR', 'CO', 'CUEI','CU', 'VENCA','CA', 'CS','CLEN','CL', 'CZ', 'CTIQ', + 'CTIF','CTIC','CTIS','CTIL','CTIO','CTI', 'CTU', 'CTE','CTO','CTR','CT', 'PH', 'TH', + 'OW', 'LH', 'RDL', 'CHLO', 'CHR', 'PTIA'); $convPrOut = array( 'NIES','NIET','NIER', 'NE', 'JI', 'NI','NIA','NIOU','NIUR','JI','OUGIN', - 'AJOL', 'AJOT','JEOLO','JEOM','JEOP','JEOG','JEOS','JORJ','JEOR','NJOT','UJOT','JEOT','JEOD','JEOC', 'JO','JA' ,'JE', - 'K', 'K', 'SI', 'SI', 'KN','IKM', 'SAT','SE', - 'KR', 'KO', 'KEI','KU', 'VANSA','KA', 'KS','KLAN','KL', 'KZ', 'KTIK', - 'KTIF','KTIS','KTIS','KTIL','KSIO','KTI', 'KTU', 'KTE','KTO','KTR','KT', 'F', 'T', - 'OU', 'L', 'RL', 'KLO', 'KR', 'PSIA'); + 'AJOL', 'AJOT','JEOLO','JEOM','JEOP','JEOG','JEOS','JORJ','JEOR','NJOT','UJOT','JEOT','JEOD','JEOC', 'JO','JA' ,'JE', + 'K', 'K', 'SI', 'SI', 'KN','IKM', 'SAT','SE', + 'KR', 'KO', 'KEI','KU', 'VANSA','KA', 'KS','KLAN','KL', 'KZ', 'KTIK', + 'KTIF','KTIS','KTIS','KTIL','KSIO','KTI', 'KTU', 'KTE','KTO','KTR','KT', 'F', 'T', + 'OU', 'L', 'RL', 'KLO', 'KR', 'PSIA'); $sIn = str_replace( $convPrIn, $convPrOut, $sIn ); $sIn = preg_replace( '`GU([^RLMBSTPZN])`', 'G$1', $sIn ); // Gueu ! @@ -394,9 +396,9 @@ class Class_Indexation { // TI -> SI v2.0 $convPrIn = array( 'BUTIE','BUTIA','BATIA','ANTIEL','RETION','ENTIEL','ENTIAL','ENTIO','ENTIAI','UJETION','ATIEM','PETIEN', - 'CETIE','OFETIE','IPETI','LBUTION','BLUTION','LETION','LATION','SATIET'); + 'CETIE','OFETIE','IPETI','LBUTION','BLUTION','LETION','LATION','SATIET'); $convPrOut = array( 'BUSIE','BUSIA','BASIA','ANSIEL','RESION','ENSIEL','ENSIAL','ENSIO','ENSIAI','UJESION','ASIAM','PESIEN', - 'CESIE','OFESIE','IPESI','LBUSION','BLUSION','LESION','LASION','SASIET'); + 'CESIE','OFESIE','IPESI','LBUSION','BLUSION','LESION','LASION','SASIET'); $sIn = str_replace( $convPrIn, $convPrOut, $sIn ); $sIn = preg_replace( '`(.+)ANTI(AL|O)`', '$1ANSI$2', $sIn ); // sauf antialcoolique, antialbumine, antialarmer, ... $sIn = preg_replace( '`(.+)INUTI([^V])`', '$1INUSI$2', $sIn ); // sauf inutilité, inutilement, diminutive, ... @@ -408,15 +410,15 @@ class Class_Indexation { // H muet $sIn = preg_replace( '`([^CS])H`', '$1', $sIn ); // H muet - $sIn = str_replace( "ESH", "ES", $sIn ); // H muet - $sIn = str_replace( "NSH", "NS", $sIn ); // H muet - $sIn = str_replace( "SH", "CH", $sIn ); // ou pas! + $sIn = str_replace( 'ESH', 'ES', $sIn ); // H muet + $sIn = str_replace( 'NSH', 'NS', $sIn ); // H muet + $sIn = str_replace( 'SH', 'CH', $sIn ); // ou pas! // NASALES $convNasIn = array( 'OMT','IMB', 'IMP','UMD','TIENT','RIENT','DIENT','IEN', - 'YMU','YMO','YMA','YME', 'YMI','YMN','YM', 'AHO','FAIM','DAIM','SAIM','EIN','AINS'); + 'YMU','YMO','YMA','YME', 'YMI','YMN','YM', 'AHO','FAIM','DAIM','SAIM','EIN','AINS'); $convNasOut = array( 'ONT','INB', 'INP','OND','TIANT','RIANT','DIANT', 'IN', - 'IMU','IMO','IMA','IME', 'IMI','IMN','IN', 'AO', 'FIN','DIN', 'SIN','AIN','INS'); + 'IMU','IMO','IMA','IME', 'IMI','IMN','IN', 'AO', 'FIN','DIN', 'SIN','AIN','INS'); $sIn = str_replace( $convNasIn, $convNasOut, $sIn ); // AIN -> IN v2.0 $sIn = preg_replace( '`AIN$`', 'IN', $sIn ); @@ -426,7 +428,7 @@ class Class_Indexation { $sIn = preg_replace( '`([JTVLFMRPSBD])UN([^IAE])`', '$1IN$2', $sIn ); $sIn = preg_replace( '`([JTVLFMRPSBD])UN$`', '$1IN', $sIn ); $sIn = preg_replace( '`RFUM$`', 'RFIN', $sIn ); - $sIn = preg_replace( '`LUMB`', 'LINB', $sIn ); + $sIn = str_replace( 'LUMB', 'LINB', $sIn ); // EN -> AN $sIn = preg_replace( '`([^BCDFGHJKLMNPQRSTVWXZ])EN`', '$1AN', $sIn ); $sIn = preg_replace( '`([VTLJMRPDSBFKNG])EN([BRCTDKZSVN])`', '$1AN$2', $sIn ); // deux fois pour les motifs recouvrants malentendu, pendentif, ... @@ -448,30 +450,30 @@ class Class_Indexation { // Les retouches! $sIn = preg_replace( '`^BENJ`', 'BINJ', $sIn ); // retouche BENJ -> BINJ - $sIn = preg_replace( '`RTIEL`', 'RSIEL', $sIn ); // retouche RTIEL -> RSIEL - $sIn = preg_replace( '`PINK`', 'PONK', $sIn ); // retouche PINK -> PONK - $sIn = preg_replace( '`KIND`', 'KOND', $sIn ); // retouche KIND -> KOND + $sIn = str_replace( 'RTIEL', 'RSIEL', $sIn ); // retouche RTIEL -> RSIEL + $sIn = str_replace( 'PINK', 'PONK', $sIn ); // retouche PINK -> PONK + $sIn = str_replace( 'KIND', 'KOND', $sIn ); // retouche KIND -> KOND $sIn = preg_replace( '`KUM(N|P)`', 'KON$1', $sIn ); // retouche KUMN KUMP - $sIn = preg_replace( '`LKOU`', 'LKO', $sIn ); // retouche LKOU -> LKO - $sIn = preg_replace( '`EDBE`', 'EBE', $sIn ); // retouche EDBE pied-bÅ“uf - $sIn = preg_replace( '`ARCM`', 'ARKM', $sIn ); // retouche SCH -> CH - $sIn = preg_replace( '`SCH`', 'CH', $sIn ); // retouche SCH -> CH + $sIn = str_replace( 'LKOU', 'LKO', $sIn ); // retouche LKOU -> LKO + $sIn = str_replace( 'EDBE', 'EBE', $sIn ); // retouche EDBE pied-bÅ“uf + $sIn = str_replace( 'ARCM', 'ARKM', $sIn ); // retouche SCH -> CH + $sIn = str_replace( 'SCH', 'CH', $sIn ); // retouche SCH -> CH $sIn = preg_replace( '`^OINI`', 'ONI', $sIn ); // retouche début OINI -> ONI $sIn = preg_replace( '`([^NDCGRHKO])APT`', '$1AT', $sIn ); // retouche APT -> AT $sIn = preg_replace( '`([L]|KON)PT`', '$1T', $sIn ); // retouche LPT -> LT - $sIn = preg_replace( '`OTB`', 'OB', $sIn ); // retouche OTB -> OB (hautbois) - $sIn = preg_replace( '`IXA`', 'ISA', $sIn ); // retouche IXA -> ISA - $sIn = preg_replace( '`TG`', 'G', $sIn ); // retouche TG -> G + $sIn = str_replace( 'OTB', 'OB', $sIn ); // retouche OTB -> OB (hautbois) + $sIn = str_replace( 'IXA', 'ISA', $sIn ); // retouche IXA -> ISA + $sIn = str_replace( 'TG', 'G', $sIn ); // retouche TG -> G $sIn = preg_replace( '`^TZ`', 'TS', $sIn ); // retouche début TZ -> TS - $sIn = preg_replace( '`PTIE`', 'TIE', $sIn ); // retouche PTIE -> TIE - $sIn = preg_replace( '`GT`', 'T', $sIn ); // retouche GT -> T - $sIn = str_replace( "ANKIEM", "ANKILEM", $sIn ); // retouche tranquillement + $sIn = str_replace( 'PTIE', 'TIE', $sIn ); // retouche PTIE -> TIE + $sIn = str_replace( 'GT', 'T', $sIn ); // retouche GT -> T + $sIn = str_replace( 'ANKIEM', 'ANKILEM', $sIn ); // retouche tranquillement $sIn = preg_replace( "`(LO|RE)KEMAN`", "$1KAMAN", $sIn ); // KEMAN -> KAMAN $sIn = preg_replace( '`NT(B|M)`', 'N$1', $sIn ); // retouche TB -> B TM -> M - $sIn = preg_replace( '`GSU`', 'SU', $sIn ); // retouche GS -> SU - $sIn = preg_replace( '`ESD`', 'ED', $sIn ); // retouche ESD -> ED - $sIn = preg_replace( '`LESKEL`','LEKEL', $sIn ); // retouche LESQUEL -> LEKEL - $sIn = preg_replace( '`CK`', 'K', $sIn ); // retouche CK -> K + $sIn = str_replace( 'GSU', 'SU', $sIn ); // retouche GS -> SU + $sIn = str_replace( 'ESD', 'ED', $sIn ); // retouche ESD -> ED + $sIn = str_replace( 'LESKEL', 'LEKEL', $sIn ); // retouche LESQUEL -> LEKEL + $sIn = str_replace( 'CK', 'K', $sIn ); // retouche CK -> K // Terminaisons $sIn = preg_replace( '`USIL$`', 'USI', $sIn ); // terminaisons USIL -> USI @@ -479,35 +481,72 @@ class Class_Indexation { $sIn = preg_replace( '`([^KL]+)T$`', '$1', $sIn ); // sauf KT LT terminal $sIn = preg_replace( '`^[H]`', '', $sIn ); // H pseudo muet en début de mot, je sais, ce n'est pas une terminaison $sBack2=$sIn; // on sauve le code (utilisé pour les mots très courts) - $sIn = preg_replace( '`TIL$`', 'TI', $sIn ); // terminaisons TIL -> TI - $sIn = preg_replace( '`LC$`', 'LK', $sIn ); // terminaisons LC -> LK - $sIn = preg_replace( '`L[E]?[S]?$`', 'L', $sIn ); // terminaisons LE LES -> L - $sIn = preg_replace( '`(.+)N[E]?[S]?$`', '$1N', $sIn ); // terminaisons NE NES -> N - $sIn = preg_replace( '`EZ$`', 'E', $sIn ); // terminaisons EZ -> E - $sIn = preg_replace( '`OIG$`', 'OI', $sIn ); // terminaisons OIG -> OI - $sIn = preg_replace( '`OUP$`', 'OU', $sIn ); // terminaisons OUP -> OU - $sIn = preg_replace( '`([^R])OM$`', '$1ON', $sIn ); // terminaisons OM -> ON sauf ROM - $sIn = preg_replace( '`LOP$`', 'LO', $sIn ); // terminaisons LOP -> LO - $sIn = preg_replace( '`NTANP$`', 'NTAN', $sIn ); // terminaisons NTANP -> NTAN - $sIn = preg_replace( '`TUN$`', 'TIN', $sIn ); // terminaisons TUN -> TIN - $sIn = preg_replace( '`AU$`', 'O', $sIn ); // terminaisons AU -> O - $sIn = preg_replace( '`EI$`', 'AI', $sIn ); // terminaisons EI -> AI - $sIn = preg_replace( '`R[DG]$`', 'R', $sIn ); // terminaisons RD RG -> R - $sIn = preg_replace( '`ANC$`', 'AN', $sIn ); // terminaisons ANC -> AN - $sIn = preg_replace( '`KROC$`', 'KRO', $sIn ); // terminaisons C muet de CROC, ESCROC - $sIn = preg_replace( '`HOUC$`', 'HOU', $sIn ); // terminaisons C muet de CAOUTCHOUC - $sIn = preg_replace( '`OMAC$`', 'OMA', $sIn ); // terminaisons C muet de ESTOMAC (mais pas HAMAC) - $sIn = preg_replace( '`([J])O([NU])[CG]$`', '$1O$2', $sIn );// terminaisons C et G muet de OUC ONC OUG - $sIn = preg_replace( '`([^GTR])([AO])NG$`', '$1$2N', $sIn );// terminaisons G muet ANG ONG sauf GANG GONG TANG TONG - $sIn = preg_replace( '`UC$`', 'UK', $sIn ); // terminaisons UC -> UK - $sIn = preg_replace( '`AING$`', 'IN', $sIn ); // terminaisons AING -> IN - $sIn = preg_replace( '`([EISOARN])C$`', '$1K', $sIn ); // terminaisons C -> K - $sIn = preg_replace( '`([ABD-MO-Z]+)[EH]+$`', '$1', $sIn ); // terminaisons E ou H sauf pour C et N - $sIn = preg_replace( '`EN$`', 'AN', $sIn ); // terminaisons EN -> AN (difficile à faire avant sans avoir des soucis) Et encore, c'est pas top! - $sIn = preg_replace( '`(NJ)EN$`', '$1AN', $sIn ); // terminaisons EN -> AN - $sIn = preg_replace( '`^PAIEM`', 'PAIM', $sIn ); // PAIE -> PAI - $sIn = preg_replace( '`([^NTB])EF$`', '\1', $sIn ); // F muet en fin de mot - $sIn = preg_replace( '`(.)\1`', '$1', $sIn ); // supression des répétitions (suite à certains remplacements) + + $convPartIn = [ + '`TIL$`', // terminaisons TIL -> TI + '`LC$`', // terminaisons LC -> LK + '`L[E]?[S]?$`', // terminaisons LE LES -> L + '`(.+)N[E]?[S]?$`', // terminaisons NE NES -> N + '`EZ$`', // terminaisons EZ -> E + '`OIG$`', // terminaisons OIG -> OI + '`OUP$`', // terminaisons OUP -> OU + '`([^R])OM$`', // terminaisons OM -> ON sauf ROM + '`LOP$`', // terminaisons LOP -> LO + '`NTANP$`', // terminaisons NTANP -> NTAN + '`TUN$`', // terminaisons TUN -> TIN + '`AU$`', // terminaisons AU -> O + '`EI$`', // terminaisons EI -> AI + '`R[DG]$`', // terminaisons RD RG -> R + '`ANC$`', // terminaisons ANC -> AN + '`KROC$`', // terminaisons C muet de CROC, ESCROC + '`HOUC$`', // terminaisons C muet de CAOUTCHOUC + '`OMAC$`', // terminaisons C muet de ESTOMAC (mais pas HAMAC) + '`([J])O([NU])[CG]$`',// terminaisons C et G muet de OUC ONC OUG + '`([^GTR])([AO])NG$`',// terminaisons G muet ANG ONG sauf GANG GONG TANG TONG + '`UC$`', // terminaisons UC -> UK + '`AING$`', // terminaisons AING -> IN + '`([EISOARN])C$`', // terminaisons C -> K + '`([ABD-MO-Z]+)[EH]+$`', // terminaisons E ou H sauf pour C et N + '`EN$`', // terminaisons EN -> AN (difficile à faire avant sans avoir des soucis) Et encore, + '`(NJ)EN$`',// terminaisons EN -> AN + '`^PAIEM`', // PAIE -> PAI + '`([^NTB])EF$`', // F muet en fin de mot + '`(.)\1`' // supression des répétitions (suite à certains remplacements) + ]; + + $convPartOut = [ + 'TI', // terminaisons TIL -> TI + 'LK', // terminaisons LC -> LK + 'L', // terminaisons LE LES -> L + '$1N', // terminaisons NE NES -> N + 'E', // terminaisons EZ -> E + 'OI', // terminaisons OIG -> OI + 'OU', // terminaisons OUP -> OU + '$1ON', // terminaisons OM -> ON sauf ROM + 'LO', // terminaisons LOP -> LO + 'NTAN', // terminaisons NTANP -> NTAN + 'TIN', // terminaisons TUN -> TIN + 'O', // terminaisons AU -> O + 'AI', // terminaisons EI -> AI + 'R', // terminaisons RD RG -> R + 'AN', // terminaisons ANC -> AN + 'KRO', // terminaisons C muet de CROC, ESCROC + 'HOU', // terminaisons C muet de CAOUTCHOUC + 'OMA', // terminaisons C muet de ESTOMAC (mais pas HAMAC) + '$1O$2',// terminaisons C et G muet de OUC ONC OUG + '$1$2N',// terminaisons G muet ANG ONG sauf GANG GONG TANG TONG + 'UK', // terminaisons UC -> UK + 'IN', // terminaisons AING -> IN + '$1K', // terminaisons C -> K + '$1', // terminaisons E ou H sauf pour C et N + 'AN', // terminaisons EN -> AN (difficile à faire avant sans avoir des soucis) Et encore, c'est pas top! + '$1AN', // terminaisons EN -> AN + 'PAIM', // PAIE -> PAI + '\1', // F muet en fin de mot + '$1' // supression des répétitions (suite à certains remplacements) + ]; + + $sIn = preg_replace( $convPartIn, $convPartOut, $sIn ); // cas particuliers, bah au final, je n'en ai qu'un ici $convPartIn = array( 'FUEL'); @@ -519,26 +558,26 @@ class Class_Indexation { // seconde chance sur les mots courts qui ont souffert de la simplification if (strlen($sIn)<2) - { - // Sigles ou abréviations - if (preg_match("`[BCDFGHJKLMNPQRSTVWXYZ][BCDFGHJKLMNPQRSTVWXYZ][BCDFGHJKLMNPQRSTVWXYZ][BCDFGHJKLMNPQRSTVWXYZ]*`",$sBack)) - return($sBack); - - if (preg_match("`[RFMLVSPJDF][AEIOU]`",$sBack)) { - if (strlen($sBack)==3) - return(substr($sBack,0,2));// mots de trois lettres supposés simples - if (strlen($sBack)==4) - return(substr($sBack,0,3));// mots de quatre lettres supposés simples + // Sigles ou abréviations + if (preg_match("`[BCDFGHJKLMNPQRSTVWXYZ][BCDFGHJKLMNPQRSTVWXYZ][BCDFGHJKLMNPQRSTVWXYZ][BCDFGHJKLMNPQRSTVWXYZ]*`",$sBack)) + return($sBack); + + if (preg_match("`[RFMLVSPJDF][AEIOU]`",$sBack)) + { + if (strlen($sBack)==3) + return(substr($sBack,0,2));// mots de trois lettres supposés simples + if (strlen($sBack)==4) + return(substr($sBack,0,3));// mots de quatre lettres supposés simples + } + + if (strlen($sBack2)>1) return $sBack2; } - - if (strlen($sBack2)>1) return $sBack2; - } if (strlen($sIn)>1) - { - return substr($sIn,0,16); // Je limite à 16 caractères mais vous faites comme vous voulez! - } + { + return substr($sIn,0,16); // Je limite à 16 caractères mais vous faites comme vous voulez! + } else return ''; - } + } } ?> \ No newline at end of file diff --git a/library/Class/Notice.php b/library/Class/Notice.php index 5a630ad51d1ae319a097b91f5f50aa97f0dd337e..3cf7a84ccada15cf23542822fafb85dbd970c728 100644 --- a/library/Class/Notice.php +++ b/library/Class/Notice.php @@ -1670,6 +1670,7 @@ class Class_Notice extends Storm_Model_Abstract { return ''; foreach($auteurs as $auteur) { + xdebug_break(); $code_alpha = (new Class_Indexation())->alphaMaj($auteur); if (!$code_alpha = str_replace(" ","x",$code_alpha)) continue;