X-Git-Url: http://git.cyclocoop.org/?p=ptitvelo%2Fweb%2Fwww.git;a=blobdiff_plain;f=www%2Fecrire%2Finc%2Frechercher.php;h=e289c73e705506088948225c2e92b9fc5e9ed0a8;hp=28bcbc309c6f1fcdd42dd8673629d45142d314eb;hb=e847eea4a82a7396dd0abf860f9b30d654f38629;hpb=d686c3e22e97dd46ef42bcd0f138c65083f8f232 diff --git a/www/ecrire/inc/rechercher.php b/www/ecrire/inc/rechercher.php index 28bcbc3..e289c73 100644 --- a/www/ecrire/inc/rechercher.php +++ b/www/ecrire/inc/rechercher.php @@ -58,14 +58,24 @@ function liste_des_jointures() { } function expression_recherche($recherche, $options) { + // ne calculer qu'une seule fois l'expression par hit + // (meme si utilisee dans plusieurs boucles) + static $expression = array(); + $key = serialize(array($recherche, $options['preg_flags'])); + if (isset($expression[$key])) + return $expression[$key]; + $u = $GLOBALS['meta']['pcre_u']; + if ($u AND strpos($options['preg_flags'],$u)===false) + $options['preg_flags'] .= $u; include_spip('inc/charsets'); - $recherche = trim(translitteration($recherche)); + $recherche = trim($recherche); $is_preg = false; if (substr($recherche,0,1)=='/' AND substr($recherche,-1,1)=='/'){ // c'est une preg - $preg = $recherche.$options['preg_flags']; + $recherche_trans = translitteration($recherche); + $preg = $recherche_trans.$options['preg_flags']; $is_preg = true; } else{ @@ -85,9 +95,10 @@ function expression_recherche($recherche, $options) { // mais on cherche quand même l'expression complète, même si elle // comporte des mots de moins de quatre lettres $recherche = rtrim($recherche.preg_replace(',\s+,'.$u, '|', $recherche_inter), '|'); + $recherche_trans = translitteration($recherche); } - $preg = '/'.str_replace('/', '\\/', $recherche).'/' . $options['preg_flags']; + $preg = '/'.str_replace('/', '\\/', $recherche_trans).'/' . $options['preg_flags']; } // Si la chaine est inactive, on va utiliser LIKE pour aller plus vite @@ -101,7 +112,8 @@ function expression_recherche($recherche, $options) { array('(',')','?','[', ']', '+', '*', '/'), array('\(','\)','[?]', '\[', '\]', '\+', '\*', '\/'), $recherche); - $recherche_mod = $recherche; + $recherche_trans = translitteration($recherche); + $recherche_mod = $recherche_trans; // echapper les % et _ $q = str_replace(array('%','_'), array('\%', '\_'), trim($recherche)); @@ -132,7 +144,32 @@ function expression_recherche($recherche, $options) { $q = sql_quote(trim($recherche, '/')); } - return array($methode, $q, $preg); + // tous les caracteres transliterables de $q sont remplaces par un joker + // permet de matcher en SQL meme si on est sensible aux accents (SQLite) + $q_t = $q; + for($i = 0;$i