IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

preg_replace pour un moteur de recherche [RegEx]


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 41
    Points : 28
    Points
    28
    Par défaut preg_replace pour un moteur de recherche
    Bonjour,
    j'ai un soucis dont je n'arrive pas à me débarrasser dans mon moteur de recherche.
    Après avoir effectué une recherche sur plusieurs mots , je mets en évidence ces mots recherchés mais j'ai un problème avec la lettre b.
    En effet, j'utilise la balise <b> pour mettre en gras les mots recherchés mais cette lettre b s'interpose dans la zone de texte affichée.

    ex:
    je recherche "test b", voici le résultat obtenu :
    <b>tb>es<b>tb>

    je vous mets une partie du code.
    merci pour votre aide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    $mots = split(" +",$recherche);
    $nombre_mots = count ($mots); //compte le nombre de mots
    $valeur_requete = "";
     
     
    for($nombre_mots_boucle = 0; $nombre_mots_boucle < $nombre_mots; $nombre_mots_boucle++) //tant que le nombre de mots de la recherche est supérieur à celui de la boucle, on continue en augmentant le nombre de mots de 1 à chaque fois
    {
    $valeur_requete .= '' . $and_ou_or . ' titre LIKE \'%' . mysql_real_escape_string($mots[$nombre_mots_boucle]) . '%\''; //modification de la variable $valeur_requete
    $valeur_requete2 .= '' . $and_ou_or . ' description LIKE \'%' . mysql_real_escape_string($mots[$nombre_mots_boucle]) . '%\'';
    $valeur_requete3 .= '' . $and_ou_or . ' content_id LIKE \'%' . mysql_real_escape_string($mots[$nombre_mots_boucle]) . '%\'';
    }
    $valeur_requete = ltrim($valeur_requete,$and_ou_or); //suppression de AND ou de OR au début de la boucle
    $valeur_requete2 = ltrim($valeur_requete2,$and_ou_or);
    $valeur_requete3 = ltrim($valeur_requete3,$and_ou_or);
     
     
     
    $counter = mysql_query("SELECT count(*) FROM contenu
    WHERE $valeur_requete or $valeur_requete2 or $valeur_requete3
    ORDER BY content_id DESC") or die (mysql_error()); 
    $nb_total_bis=mysql_result($counter,0,"count(*)" );
     
    $selection_recherche = mysql_query("SELECT * FROM contenu
    WHERE $valeur_requete or $valeur_requete2 or $valeur_requete3
    ORDER BY content_id DESC limit $premiereEntree_bis,$limit"); //requête avec le résultat de la boucle dedans
     
     
    $nombre_resultats = mysql_num_rows($selection_recherche); //compte le nombre d'entrées sélectionnées par la recherche
    if ($nombre_resultats == 0) //s'il n'y a pas de résultat
    {
     
    echo "<center>Désolé, la base de données ne contient pas  <b>$recherche</b>...</center>";
    }
    else if ($recherche=="" )     {echo "<center>Veuillez saisir un ou plusieurs mot-clés avant de cliquer sur 'Rechercher' !</center>";}
    else if (strlen($recherche)<2) {echo "<center>Veuillez saisir au moins 2 caractères.</center>";}
    // AFFICHAGE DES RESULTATS 
    else
    { 
     
    $i=0;
     
    while($i<$nombre_resultats)
        {
     
     
    	$avant = array("\\","/","#","*","é","?","<",">","+",")","à","|","(","[");
    	$apres = array("//","//","//","//","e","//","//","//","//","//","a","//","//","//");
    	$mots=str_replace($avant,$apres,$mots); 
    	$dept_id = mysql_result($selection_recherche,$i,"dept_id");
    	$sous_type_one = mysql_result($selection_recherche,$i,"sous_type_one");
    	$content_type =mysql_result($selection_recherche,$i,"content_type");
    	$content_id = mysql_result($selection_recherche,$i,"content_id");
        $description=mysql_result($selection_recherche,$i,"description");
    	$titre=mysql_result($selection_recherche,$i,"titre");
    	for($nombre_mots_boucle = 0; $nombre_mots_boucle < $nombre_mots; $nombre_mots_boucle++) //tant que le nombre de mots de la recherche est supérieur à celui de la boucle, on continue en augmentant le nombre de mots de 1 à chaque fois
        {	
    	$rech[$nombre_mots_boucle]= "#($mots[$nombre_mots_boucle])#i" ; // i permet de conserver la casse
    	}
     
    	$sortie ='<b>$1</b>'; 
    	$result = preg_replace($rech,$sortie,$titre);
     
    	echo "<font color =blue>$result</font>";
    	echo "<br>";
    	echo preg_replace($rech,$sortie,$description);
        echo "<br>";	
    	}

  2. #2
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par mike_chti Voir le message
    je recherche "test b", voici le résultat obtenu :
    <b>tb>es<b>tb>
    Salut,

    Le code étant plutôt fourni, pourrais-tu indiquer le motif utilisé dans ton exemple (la valeur de la variable $rech) ?

    Merci
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    excusez moi, mais je n'ai pas saisie le sens de votre question!
    j'utilise un formulaire ayant pour méthode POST.
    dans mon input type text, je saisie "test b" pour reproduire le problème.
    cette donnée a été enregistrée en amont dans ma base de donnée mysql.

    pour information si je mets <strong> à la place de <b> alors mon problème va se poser sur la balise <strong> au lieu de <b>.
    Bizarre...

  4. #4
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par mike_chti Voir le message
    excusez moi, mais je n'ai pas saisie le sens de votre question!
    j'utilise un formulaire ayant pour méthode POST.
    dans mon input type text, je saisie "test b" pour reproduire le problème.
    cette donnée a été enregistrée en amont dans ma base de donnée mysql.

    pour information si je mets <strong> à la place de <b> alors mon problème va se poser sur la balise <strong> au lieu de <b>.
    Bizarre...
    Pourriez-vous nous donner le résultat de ce dump:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var_dump($rech);
    echo preg_replace($rech,$sortie,$description);
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    Voici le résultat :

    array(2) { [0]=> string(9) "#(test)#i" [1]=> string(6) "#(b)#i" } <b>testb> b

  6. #6
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Alors voici un code qui peut te mettre sur la piste:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    $myString = "test";
    $myArr = array("#(test)#i", "#( (?:(?<!<)|(?<!</))strong(?!>))#i");
    print preg_replace($myArr, "<strong>$1</strong>", $myString);
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    ok je testerai un peu plus tard, en tout cas Merci pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Base de données : stratégie à adopter pour un moteur de recherche
    Par yohan0262 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 04/06/2007, 11h35
  2. selection date ou VIDE pour un moteur de recherche
    Par popofpopof dans le forum VBA Access
    Réponses: 4
    Dernier message: 16/05/2007, 07h29
  3. Réponses: 7
    Dernier message: 03/04/2007, 20h57
  4. [SQL] Aide pour un moteur de recherche
    Par Death83 dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 26/10/2005, 14h12
  5. comment faire ma base de donnée pour un moteur de recherche
    Par HoB dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 04/05/2004, 15h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo