Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Invité de passage
    Inscrit en
    octobre 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : octobre 2008
    Messages : 31
    Points : 2
    Points
    2

    Par défaut Utilisation un peu spéciale de preg_replace pour moteur de recherche

    Bonjour à tous,

    Désolé pour le titre je ne voyais pas comment l'expliquer en quelques mots.

    Voici le contexte:
    Je réalise un moteur de recherche sur des pages de contenu (type CMS).
    Les textes contenus dans la base de données sont encodés en HTML, j'ai donc tous mes accents convertis, par exemple "é" dans ma base est "é " (j'utilise tinyMCE).

    Lorsque le visiteur tape un mot sans accent j'aimerai pouvoir le chercher et le trouvé même si il a un accent.
    exemple :
    mot saisie par le visiteur : preference
    j'aimerai que ça me trouve : préférence

    Voici le code que j'utilise :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    $pattern = array();
    $pattern[0] = '/e/';
    $pattern[1] = '/a/';
    $pattern[2] = '/i/';
    $pattern[3] = '/o/';
    $pattern[4] = '/u/';
    $pattern[5] = '/c/';
     
    $replace_html = array();
    $replace_html[0] = "(e|é|É|è|È|ê|Ê|ë|Ë)";
    $replace_html[1] = "(a|à|À|â|Â|ä|Ä)";
    $replace_html[2] = "(i|î|Î|ï|Ï)";
    $replace_html[3] = "(o|ô|Ô|ö|Ö)";
    $replace_html[4] = "(u|ù|Ù|û|Û|ü|Ü)";
    $replace_html[5] = "(c|ç|Ç)";
     
    $motscles = $_GET["motscles"];
    $motscles = mysql_real_escape_string(trim($motscles));
    if(!empty($motscles)) {
    	$tab_mc = explode(" ",$motscles);
    	$cptmot = 0;
    	foreach($tab_mc as $k => $mot) {
    		if(strlen($mot) > 2) {
    			$mothtml = $mot;
    			$motreg = $mot;
    			$motreg = preg_replace($pattern,$replace_accent,$motreg);
    			$mothtml = preg_replace($pattern,$replace_html,$mothtml);
    			$mothtml = htmlentities($mothtml);
    			if($cptmot > 0) $param_txt .= " AND ";
    			$param_txt .= "T.contenu REGEXP '[[:<:]]".$mothtml."[[:>:]]'";
    			$cptmot++;
    		}
    	}
    	if($cptmot) {
    		$rcont = mysql_query("SELECT T.contenu, M.id, M.libelle FROM texte T 
    								LEFT OUTER JOIN page_contenu P ON P.id = T.idcontenu 
    								LEFT OUTER JOIN menu M ON P.idpage = M.id 
    								WHERE ".$param_txt);
    		$nbcont = mysql_num_rows($rcont);
     
     
    	}
    }
    Le problème est qu'il me remplace le "e" par ce qu'il faut mais ensuite même les voyelles dans les chaines de remplacement sont aussi remplacer, ce qui donne un remplacement d'un remplacement et ainsi de suite.

    Y a t'il un moyen de ne pas remplacer les chaines qui ont servies de remplacement.

    J'espère être assez clair, n'hésitez pas si vous avez besoin de précisions.

    Merci d'avance.

  2. #2
    Membre Expert
    Avatar de Seb33300
    Homme Profil pro Sébastien Alfaiate
    Développeur Web
    Inscrit en
    janvier 2007
    Messages
    1 459
    Détails du profil
    Informations personnelles :
    Nom : Homme Sébastien Alfaiate
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : janvier 2007
    Messages : 1 459
    Points : 2 256
    Points
    2 256

    Par défaut

    Je ne sais pas si ton site contient beaucoup de pages, mais peut etre serait il plus judicieux de réenregisrer tes pages sans la converson de caractères.

    Il existe un option qui permet de configurer TinyMCE de telle sorte à ce qu'il ne convertisse pas les caractères spéciaux.

    Il faut passer l'option entity_encoding à raw.

    http://www.tinymce.com/wiki.php/Conf...ntity_encoding
    Zend Certified Engineer PHP 5.3

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  3. #3
    Invité de passage
    Inscrit en
    octobre 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : octobre 2008
    Messages : 31
    Points : 2
    Points
    2

    Par défaut

    Merci Seb pour cette idée mais j'y avait déjà pensé.

    Et en effet il y a beaucoup de page et de contenu déjà donc si je pouvais trouver une solution sans changer la configuration de tinyMCE, ça m'arrangerait bien.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •