analyser(); } foreach($tdiac->table as $wreplace => $wdiacritique) { if(pmb_preg_match("/$wdiacritique/", $chaine)) $chaine = pmb_preg_replace("/$wdiacritique/", $wreplace, $chaine); } $tab = pmb_split('/\s/', $chaine); // mise en forme de la chaine pour les alternatives // on fonctionne avec OU (pour l'instant) if(sizeof($tab) > 1) { foreach($tab as $dummykey=>$word) { if($word) $this->mots[] = "($word)"; } return join('|', $this->mots); } else { return $chaine; } } function convert_diacrit($string) { global $tdiac; global $charset; global $include_path; if(!$string) return; if (!$tdiac) { $tdiac = new XMLlist("$include_path/messages/diacritique$charset.xml"); $tdiac->analyser(); } foreach($tdiac->table as $wreplace => $wdiacritique) { if(pmb_preg_match("/$wdiacritique/", $string)) $string = pmb_preg_replace("/$wdiacritique/", $wreplace, $string); } return $string; } //strip_empty_chars : enlêve tout ce qui n'est pas alphabétique ou numérique d'une chaine function strip_empty_chars($string) { // traitement des diacritiques $string = convert_diacrit($string); // Mis en commentaire : qu'en est-il des caractères non latins ??? // SUPPRIME DU COMMENTAIRE : ER : 12/05/2004 : ça fait tout merder... // RECH_14 : Attention : ici suppression des éventuels " // les " ne sont plus supprimés $string = stripslashes($string) ; $string = pmb_alphabetic('^a-z0-9\s', ' ',pmb_strtolower($string)); // remplacement espace insécable 0xA0:   Non-breaking space $string = clean_nbsp($string); // espaces en début et fin $string = pmb_preg_replace('/^\s+|\s+$/', '', $string); // espaces en double $string = pmb_preg_replace('/\s+/', ' ', $string); return $string; } // strip_empty_words : fonction enlevant les mots vides d'une chaîne function strip_empty_words($string) { // on inclut le tableau des mots-vides pour la langue par defaut // c'est normalement la langue de catalogage... // si après nettoyage des mots vide la chaine est vide alors on garde la chaine telle quelle (sans les accents) global $empty_word; // nettoyage de l'entrée // traitement des diacritiques $string = convert_diacrit($string); // Mis en commentaire : qu'en est-il des caractères non latins ??? // SUPPRIME DU COMMENTAIRE : ER : 12/05/2004 : ça fait tout merder... // RECH_14 : Attention : ici suppression des éventuels " // les " ne sont plus supprimés $string = stripslashes($string) ; $string = pmb_alphabetic('^a-z0-9\s', ' ',pmb_strtolower($string)); // remplacement espace insécable 0xA0:   Non-breaking space $string = clean_nbsp($string); // espaces en début et fin $string = pmb_preg_replace('/^\s+|\s+$/', '', $string); // espaces en double $string = pmb_preg_replace('/\s+/', ' ', $string); $string_avant_mots_vides = $string ; // suppression des mots vides if(is_array($empty_word)) { foreach($empty_word as $dummykey=>$word) { $word = convert_diacrit($word); $string = pmb_preg_replace("/^${word}$|^${word}\s|\s${word}\s|\s${word}\$/i", ' ', $string); // RECH_14 : suppression des mots vides collés à des guillemets if (pmb_preg_match("/\"${word}\s/i",$string)) $string = pmb_preg_replace("/\"${word}\s/i", '"', $string); if (pmb_preg_match("/\s${word}\"/i",$string)) $string = pmb_preg_replace("/\s${word}\"/i", '"', $string); } } // re nettoyage des espaces générés // espaces en dÈbut et fin $string = pmb_preg_replace('/^\s+|\s+$/', '', $string); // espaces en double $string = pmb_preg_replace('/\s+/', ' ', $string); if (!$string) { $string = $string_avant_mots_vides ; // re nettoyage des espaces générés // espaces en dÈbut et fin $string = pmb_preg_replace('/^\s+|\s+$/', '', $string); // espaces en double $string = pmb_preg_replace('/\s+/', ' ', $string); } return $string; } // clean_string() : fonction de nettoyage d'une chaîne function clean_string($string) { // on supprime les caractËres non-imprimables $string = pmb_preg_replace("/\\x0|[\x01-\x1f]/U","",$string); // suppression des caractËres de ponctuation indÈsirables // $string = pmb_preg_replace('/[\{\}\"]/', '', $string); // supression du point et des espaces de fin $string = pmb_preg_replace('/\s+\.$|\s+$/', '', $string); // nettoyage des espaces autour des parenthËses $string = pmb_preg_replace('/\(\s+/', '(', $string); $string = pmb_preg_replace('/\s+\)/', ')', $string); // idem pour les crochets $string = pmb_preg_replace('/\[\s+/', '[', $string); $string = pmb_preg_replace('/\s+\]/', ']', $string); // petit point de détail sur les apostrophes $string = pmb_preg_replace('/\'\s+/', "'", $string); // 'trim' par regex $string = pmb_preg_replace('/^\s+|\s+$/', '', $string); // suppression des espaces doubles $string = pmb_preg_replace('/\s+/', ' ', $string); return $string; } //Corrections des caractères bizarres (voir pourris) de M$ function cp1252Toiso88591($str){ $cp1252_map = array( "\x80" => "EUR", /* EURO SIGN */ "\x82" => "\xab", /* SINGLE LOW-9 QUOTATION MARK */ "\x83" => "\x66", /* LATIN SMALL LETTER F WITH HOOK */ "\x84" => "\xab", /* DOUBLE LOW-9 QUOTATION MARK */ "\x85" => "...", /* HORIZONTAL ELLIPSIS */ "\x86" => "?", /* DAGGER */ "\x87" => "?", /* DOUBLE DAGGER */ "\x88" => "?", /* MODIFIER LETTER CIRCUMFLEX ACCENT */ "\x89" => "?", /* PER MILLE SIGN */ "\x8a" => "S", /* LATIN CAPITAL LETTER S WITH CARON */ "\x8b" => "\x3c", /* SINGLE LEFT-POINTING ANGLE QUOTATION */ "\x8c" => "OE", /* LATIN CAPITAL LIGATURE OE */ "\x8e" => "Z", /* LATIN CAPITAL LETTER Z WITH CARON */ "\x91" => "\x27", /* LEFT SINGLE QUOTATION MARK */ "\x92" => "\x27", /* RIGHT SINGLE QUOTATION MARK */ "\x93" => "\x22", /* LEFT DOUBLE QUOTATION MARK */ "\x94" => "\x22", /* RIGHT DOUBLE QUOTATION MARK */ "\x95" => "\b7", /* BULLET */ "\x96" => "\x20", /* EN DASH */ "\x97" => "\x20\x20", /* EM DASH */ "\x98" => "\x7e", /* SMALL TILDE */ "\x99" => "?", /* TRADE MARK SIGN */ "\x9a" => "S", /* LATIN SMALL LETTER S WITH CARON */ "\x9b" => "\x3e;", /* SINGLE RIGHT-POINTING ANGLE QUOTATION*/ "\x9c" => "oe", /* LATIN SMALL LIGATURE OE */ "\x9e" => "Z", /* LATIN SMALL LETTER Z WITH CARON */ "\x9f" => "Y" /* LATIN CAPITAL LETTER Y WITH DIAERESIS*/ ); $str = strtr($str, $cp1252_map); return $str; } // ---------------------------------------------------------------------------- // test_title_query() : nouvelle version analyse d'une rech. sur titre // ---------------------------------------------------------------------------- function test_title_query($query, $operator=TRUE, $force_regexp=FALSE) { // Armelle : a priori utilise uniquement dans édition des périodique. Changer la-bas. // fonction d'analyse d'une recherche sur titre // la fonction retourne un tableau : $query_result = array( 'type' => 0, 'restr' => '', 'order' => '', 'nbr_rows' => 0); // FORCAGE ER 12/05/2004 : le match against avec la troncature* ne fonctionne pas... $force_regexp = TRUE ; // $query_result['type'] = type de la requête : // 0 : rien (problème) // 1: match/against // 2: regexp // 3: regexp pure sans traitement // $query_result['restr'] = critères de restriction // $query_result['order'] = critères de tri // $query_result['indice'] = façon d'obtenir un indice de pertinence // $query_result['nbr_rows'] = nombre de lignes qui matchent // si operator TRUE La recherche est booléenne AND // si operator FALSE La recherche est booléenne OR // si force_regexp : la recherche est forcée en mode regexp $stopwords = FALSE; global $dbh; // initialisation opérateur $operator ? $dopt = 'AND' : $dopt = 'OR'; $query = strtolower($query); // espaces en début et fin $query = preg_replace('/^\s+|\s+$/', '', $query); // espaces en double $query = preg_replace('/\s+/', ' ', $query); // traitement des caractères accentués $query = convert_diacrit($query); // contrôle de la requete if(!$query) return $query_result; // déterminer si la requête est une regexp // si c'est le cas, on utilise la saisie utilisateur sans modification // (on part du principe qu'il sait ce qu'il fait) if(preg_match('/\^|\$|\[|\]|\.|\*|\{|\}|\|/', $query)) { // regexp pure : pas de modif de la saisie utilisateur $query_result['type'] = 3; $query_result['restr'] = "index_serie REGEXP '$query'"; $query_result['restr'] .= " OR tit1 REGEXP '$query'"; $query_result['restr'] .= " OR tit2 REGEXP '$query'"; $query_result['restr'] .= " OR tit3 REGEXP '$query'"; $query_result['restr'] .= " OR tit4 REGEXP '$query'"; $query_result['order'] = "index_serie ASC, tnvol ASC, tit1 ASC"; } else { // nettoyage de la chaîne $query = preg_replace("/[\(\)\,\;\'\!\-\+]/", ' ', $query); // on supprime les mots vides $query = strip_empty_words($query); // contrôle de la requete if(!$query) return $query_result; // la saisie est splitée en un tableau $tab = preg_split('/\s+/', $query); // on cherche à détecter les mots de moins de 4 caractères (stop words) // si il y des mots remplissant cette condition, c'est la méthode regexp qui sera employée foreach($tab as $dummykey=>$word) { if(strlen($word) < 4) { $stopwords = TRUE; break; } } if($stopwords || $force_regexp) { // méthode REGEXP $query_result['type'] = 2; // constitution du membre restricteur // premier mot $query_result['restr'] = "(index_sew REGEXP '${tab[0]} ) '"; for ($i = 1; $i < sizeof($tab); $i++) { $query_result['restr'] .= " $dopt (index_sew REGEXP '${tab[$i]}' )"; } // contitution de la clause de tri $query_result['order'] = "index_serie ASC, tnvol ASC, tit1 ASC"; } else { // méthode FULLTEXT $query_result['type'] = 1; // membre restricteur $query_result['restr'] = "MATCH (index_wew) AGAINST ('*${tab[0]}*')"; for ($i = 1; $i < sizeof($tab); $i++) { $query_result['restr'] .= " $dopt MATCH"; $query_result['restr'] .= " (index_wew)"; $query_result['restr'] .= " AGAINST ('*${tab[$i]}*')"; } // membre de tri $query_result['order'] = "index_serie DESC, tnvol ASC, index_sew ASC"; } } // récupération du nombre de lignes $rws = "SELECT count(1) FROM notices WHERE ${query_result['restr']}"; $result = @mysql_query($rws, $dbh); $query_result['nbr_rows'] = @mysql_result($result, 0, 0); return $query_result; } //Fonction de préparation des chaines pour regexp sans match against function analyze_query($query) { // Armelle - a priori plus utilisé // déterminer si la requête est une regexp // si c'est le cas, on utilise la saisie utilisateur sans modification // (on part du principe qu'il sait ce qu'il fait) if(preg_match('/\^|\$|\[|\]|\.|\*|\{|\}|\|\+/', $query)) { // traitement des caractères accentués $query = preg_replace('/[àáâãäåÀÁÂÃÄÅ]/' , 'a', $query); $query = preg_replace('/[éèêëÈÉÊË]/' , 'e', $query); $query = preg_replace('/[ìíîïÌÍÎÏ]/' , 'i', $query); $query = preg_replace('/[òóôõöÒÓÔÕÖ]/' , 'o', $query); $query = preg_replace('/[ùúûüÙÚÛÜ]/' , 'u', $query); $query = preg_replace('/[çÇ]/m' , 'c', $query); return $query; } else { return reg_diacrit($query); } } // ---------------------------------------------------------------------------- // fonction sur les dates // ---------------------------------------------------------------------------- // today() : retourne la date du jour au format MySQL-DATE // penser à mettre à jour les classes concernées function today() { $jour = date('Y-m-d'); return $jour; } // ---------------------------------------------------------------------------- // fonction qui retourne le nom de la page courante (SANS L'EXTENSION .php) ! // ---------------------------------------------------------------------------- function current_page() { return ereg_replace("/", "", ereg_replace("\/.*\/(.*\.php)$", "\\1", $_SERVER["PHP_SELF"])); } // ---------------------------------------------------------------------------- // fonction gen_liste qui génère des combo_box super sympas // ---------------------------------------------------------------------------- function gen_liste ($requete, $champ_code, $champ_info, $nom, $on_change, $selected, $liste_vide_code, $liste_vide_info,$option_premier_code,$option_premier_info) { $resultat_liste=mysql_query($requete); $renvoi="\n"; return $renvoi; } // ---------------------------------------------------------------------------- // fonction qui retourne le nom de la page courante (SANS L'EXTENSION .php) ! // ---------------------------------------------------------------------------- function inslink($texte="", $lien="",$param="") { if ($lien) return "$texte" ; else return "$texte" ; } // ---------------------------------------------------------------------------- // fonction qui insère l'entrée $entree dans un table si image possible avec le $code // ---------------------------------------------------------------------------- function do_image(&$entree, $code, $depliable ) { global $charset; global $opac_show_book_pics ; global $opac_book_pics_url ; global $opac_book_pics_msg; global $opac_url_base ; if ($code<>"") { if ($opac_show_book_pics=='1' && $opac_book_pics_url) { $code_chiffre = preg_replace('/-|\.| /', '', $code); $url_image = $opac_book_pics_url ; $url_image = $opac_url_base."getimage.php?url_image=".urlencode($url_image)."¬icecode=!!noticecode!!" ; if ($depliable) $image = ""; else { $url_image_ok = str_replace("!!noticecode!!", $code_chiffre, $url_image) ; $title_image_ok = htmlentities($opac_book_pics_msg, ENT_QUOTES, $charset); $image = ""; } } else $image="" ; if ($image) $entree = "
$entree$image
" ; else $entree = "
$entree
" ; } else $entree = "
$entree
" ; } // ------------------------------------------------------------------ // pmb_preg_match($regex,$chaine) : recherche d'une regex // ------------------------------------------------------------------ function pmb_preg_match($regex,$chaine) { global $charset; if ($charset != 'utf-8') { return preg_match($regex,$chaine); } else { return preg_match($regex.'u',$chaine); } } // ------------------------------------------------------------------ // pmb_preg_replace($regex,$replace,$chaine) : remplacement d'une regex par une autre // ------------------------------------------------------------------ function pmb_preg_replace($regex,$replace,$chaine) { global $charset; if ($charset != 'utf-8') { return preg_replace($regex,$replace,$chaine); } else { return preg_replace($regex.'u',$replace,$chaine); } } // ------------------------------------------------------------------ // pmb_str_replace($toreplace,$replace,$chaine) : remplacement d'une chaine par une autre // ------------------------------------------------------------------ function pmb_str_replace($toreplace,$replace,$chaine) { global $charset; if ($charset != 'utf-8') { return str_replace($toreplace,$replace,$chaine); } else { return preg_replace("/".$toreplace."/u",$replace,$chaine); } } // ------------------------------------------------------------------ // pmb_split($separateur,$string) : sépare un chaine de caractère selon un separateur // ------------------------------------------------------------------ function pmb_split($separateur,$chaine) { global $charset; if ($charset != 'utf-8') { return preg_split($separateur,$chaine); } else { return mb_split($separateur,$chaine); } } // ------------------------------------------------------------------ // pmb_alphabetic($string) : enlève les caractères non alphabétique. Equivalent de [a-z0-9] // pour les caractères latins; // Pour l'instant pour les caractères non latins: // \x{0531}-\x{0587}\x{fb13}-\x{fb17} : Armenien // \x{0621}-\x{0669}\x{066E}-\x{06D3}\x{06D5}-\x{06FF}\x{FB50}-\x{FDFF}\x{FE70}-\x{FEFF}: Arabe // \x{0400}-\x{052F}\x{0500}-\x{050F} : Cyrillique // \x{4E00}-\x{9BFF} : Chinois // \x{3040}-\x{309F}\x{30A0}-\x{30FF}\x{31F0}-\x{31FF}\x{FF00}-\x{FFEF} : Japonais (Hiragana - Katakana - Suppl. phonetique katakana - Katakana demi-chasse) // ------------------------------------------------------------------ function pmb_alphabetic($regex,$replace,$string) { global $charset; if ($charset != 'utf-8') { return preg_replace('/['.$regex.']/', ' ', $string); } else { return preg_replace('/['.$regex.'\x{0531}-\x{0587}\x{fb13}-\x{fb17}\x{0621}-\x{0669}\x{066E}-\x{06D3}\x{06D5}-\x{06FF}\x{FB50}-\x{FDFF}\x{FE70}-\x{FEFF}\x{0400}-\x{052F}\x{0500}-\x{050F}\x{4E00}-\x{9BFF}\x{3040}-\x{309F}\x{30A0}-\x{30FF}\x{31F0}-\x{31FF}\x{FF00}-\x{FFEF}]/u', ' ', $string); } } // ------------------------------------------------------------------ // pmb_strlen($string) : calcule la longueur d'une chaine pour utf-8 il s'agit du nombre de caractères. // ------------------------------------------------------------------ function pmb_strlen($string) { global $charset; if ($charset != 'utf-8') return strlen($string); else { return mb_strlen($string,$charset); } } // ------------------------------------------------------------------ // pmb_getcar($currentcar,$string) : recupere le caractere $cuurentcar de la chaine // ------------------------------------------------------------------ function pmb_getcar($currentcar,$string) { global $charset; if ($charset != 'utf-8') return $string[$currentcar]; else { return mb_substr($string,$currentcar, 1,$charset); } } // ------------------------------------------------------------------ // pmb_substr($chaine,$depart,$longueur) : recupere n caracteres // ------------------------------------------------------------------ function pmb_substr($chaine,$depart,$longueur=0) { global $charset; if ($charset != 'utf-8') { if ($longueur == 0) return substr($chaine,$depart); else return substr($chaine,$depart,$longueur); } else { if ($longueur == 0) return mb_substr($chaine,$depart,$charset); else return mb_substr($chaine,$depart,$longueur,$charset); } } // ------------------------------------------------------------------ // pmb_strtolower($string) : passage d'une chaine de caractère en minuscule // ------------------------------------------------------------------ function pmb_strtolower($string) { global $charset; if ($charset != 'utf-8') { return strtolower($string); } else { return mb_strtolower($string,$charset); } } // ------------------------------------------------------------------ // pmb_strtoupper($string) : passage d'une chaine de caractère en majuscule // ------------------------------------------------------------------ function pmb_strtoupper($string) { global $charset; if ($charset != 'utf-8') { return strtoupper($string); } else { return mb_strtoupper($string,$charset); } } // ------------------------------------------------------------------ // pmb_bidi($string) : renvoi la chaine de caractere en gérant les problemes // d'affichage droite gauche des parenthèses // ------------------------------------------------------------------ function pmb_bidi($string) { global $charset; global $lang; return $string; if ($charset != 'utf-8' or $lang == 'ar') { // utf-8 obligatoire pour l'arabe return $string; } else { //\x{0600}-\x{06FF}\x{0750}-\x{077F} : Arabic //x{0590}-\x{05FF} : hebrew if (preg_match('/[\x{0600}-\x{06FF}\x{0750}-\x{077F}\x{0590}-\x{05FF}]/u', $string)) { // 1 - j'entoure les caractères arabes + espace ou parenthese ou chiffre de ' $string = preg_replace("/([\s*( )*(&)*\-*\(*0-9*]*[\x{0600}-\x{06FF}\x{0750}-\x{077F}\x{0590}-\x{05FF}]+([,*\s*( )*(&)*\-*\(*0-9*]*[\x{0600}-\x{06FF}\x{0750}-\x{077F}\x{0590}-\x{05FF}]*[,*\s*( )*(&)*\-*\)*0-9*]*)*)/u","\\1",$string); // 2 - j'enleve les span dans les 'value' ca marche pas dans les ecrans de saisie $string = preg_replace('/value=[\'\"](.*?)<\/span>[\'\"]/u','value=\'\\1\'',$string); // 3 - j'enleve les span dans les 'title' $string = preg_replace('/title=[\'\"](.*?)<\/span>/u','title=\'\\1',$string); // 4 - j'enleve les span dans les 'alt' $string = preg_replace('/alt=[\'\"](.*?)<\/span>/u','alt=\'\\1',$string); // 4 - j'enleve les span sont entre cote, c'est que c'est dans une valeur. $string = preg_replace('/[\'\"](.*?)<\/span>\'/u','\'\\1\'',$string); // 4 - j'enleve les span dans les textarea. //preg_match('//u',$string,$toto); //printr($toto); $string = preg_replace('//u','