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

PHP & Base de données Discussion :

Mise en surbrillance de termes de recherches et accents [Sources] [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 72
    Par défaut Mise en surbrillance de termes de recherches et accents
    Bonjour à vous,

    J'ai chercher en vain sur le web une fonction php standard ou utilisateur succeptible de remplacer des termes de recherches (pour les mettre en surbrillance) trouvés avec un LIKE (mysql).

    Je m'explique :

    Actuellement mes remplacements sont insensibles à la casse grâce à l'expression régulière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $search_string_words = 'un|exemple|de|recherche';
    preg_replace("/($search_string_words)/i", "<$tag>$1</$tag>", $value);
    Il me faut une fonction ou masque qui me mettrait également en surbrillance les termes avec des caratéres spéciaux :
    Si je cherche "ete", je voudrais que "été" soit mit en surbrillance car il est renvoyé par la requête SQL.

    J'espére que vous aurez la réponse ! , merci à vous.

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 616
    Par défaut
    tu peux t'aider de cette source pour ton problème :
    http://php.developpez.com/sources/?page=regexp#surbrill

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 72
    Par défaut
    Merci pour ta réponse mathieu, mais j'ai testé la fonction que voici, et le résultat ne correspond pas à mon problème :

    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
    <?
     
    function str_light ( $chaine , $word )
    {
        $replacement = '' ;
     
                foreach ( $word as $val )
                {    
                $replacement .= $val . '|' .  upper_word ( $val ) . '|' ;
                }
     
            $replacement = substr ( $replacement , 0 , strlen ( $replacement ) - 1 ) ;
            $chaine = eregi_replace ( $replacement , '<span style="font-weight: bold;background-color: #FF0000;">\\0</span>' , $chaine ) ;
     
        return $chaine ;
    }
     
    function upper_word ( $str )
    {
        $str = strtr ( $str ,
    'ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ',
    'aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn' ) ;
        $str = strtoupper ( $str ) ;
        return $str ;
    }
     
     
    $word = array ( 'dernieres' ) ;
    $str = "L'édition de cette année du 20 au 27 mars partout en France traitera des dernières tendances en vogue, 
    		comme le phénomène des blogs ou encore l'internet mobile.";
     
    echo str_light ( $str , $word );
     
    ?>
    Résultat obtenu :
    L'édition de cette année du 20 au 27 mars partout en France traitera des dernières tendances en vogue, comme le phénomène des blogs ou encore l'internet mobile.

    Résultat recherché :
    L'édition de cette année du 20 au 27 mars partout en France traitera des dernières tendances en vogue, comme le phénomène des blogs ou encore l'internet mobile.

    Je ne vois toujours pas de solution simple.

    Je pense qu'il faudrait que je fasse une fonction de remplacement des caractéres spéciaux dans ma cible de recherche pour ensuite faire la mise en évidence des termes de recherche et enfin restaurer les termes avec caractéres spéciaux.
    Seulement une telle solution ne m'enchante guère car à mon sens, la puissance de php doit apporter des solutions moins complexes à ce genre de probléme .

    Des idées ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 72
    Par défaut
    Voila, j'ai trouvé un bout de code de "Mr N." dans un autre post et je l'ai un peu modifié pour avoir parfaitement ce qu'il me faut.

    Seulement, je pensais qu'il y avait une alternative à ce genre d'usine à gaz (à mettre dans les sources du coup) :

    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
     
    # Supprime tous les accents possibles et inimaginables 
    function cleanAccent($sToClean)
    {
    	$sMatch       = array('/[àâäåãáÂÄÀÅÃÁæÆ]/','/[ß]/','/[çÇ]/','/[Ð]/','/[éèêëÉÊËÈ]/','/[ïîìíÏÎÌÍ]/','/[ñÑ]/','/[öôóòõÓÔÖÒÕ]/','/[Šš]/','/[ùûüúÜÛÙÚ]/','/[¥ŸÝŸýÿ]/','/[Žž]/');
    	$sReplacement = array('a', 'b', 'c', 'd', 'e', 'i', 'n', 'o', 's', 'u', 'y', 'z');
     
    	return preg_replace($sMatch, $sReplacement, $sToClean);
    }
     
    # 
    # strLight(string $str, array $words, string $startTag, string $endTag)  
    # 
    # Applique les tags $startTag et $endTag aux mots trouvés dans la chaine $str
    # Retourne la chaine formatée avec les nouveaux tags
    # 
    function strLight($str, $words, $startTag, $endTag)
    {
    	$original 	= $str;	
    	$str 		= strtolower(cleanAccent($str));
    	$tagLen 	= (strlen($startTag) + strlen($endTag));
     
    	foreach($words as $word)
    	{		
    		$word	 = strtolower(cleanAccent($word));
    		$current = $offset = $delta = 0; 
    		$len 	 = strlen($word);
     
    		while(( FALSE !== ($pos = strpos($str, $word, $offset))))
    		{
    			$original  = substr($original, 0, ($pos + $delta))
                                        .$startTag.substr($original, ($pos + $delta), $len).$endTag
                                        .substr($original, ($pos + $delta + $len));
     
    			$delta    += $tagLen; // Rajout de la longueur de chaine des tags  
    			$offset    = $pos + 1;			
    		}
    	}
     
    	return $original;
    }
     
    $words 		= array('methode','Vérite');
    $str   		= 'La vérité sur les méthodes. Méthode avec des majuscule ? Méthodologique ne match pas. Et methode sans accents ?';   
    $startTag 	= '<b>';
    $endTag 	= '</b>';
     
     
    echo strLight($str, $words, $startTag, $endTag);
    Avec "$words = array('methode','Vérite');" on a bien :

    La vérité sur les méthodes. Méthode avec des majuscule ? Méthodologique ne match pas. Et methode sans accents ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 72
    Par défaut
    Je viens de voir : Cela ne fonctionne pas correctement en UTF8.

    J'étudie une solution plus adaptée à un public plus large...

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 72
    Par défaut
    Voici les fonctions qui fonctionnent pour des scripts en utf8 seulement:


    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
    # Supprime tous les accents possibles et inimaginables
    function cleanAccent($sToClean) 
    {	    
        $sToClean = mb_ereg_replace('[àâäåãáÂÄÀÅÃÁæÆ]',  'a', $sToClean);
    	$sToClean = mb_ereg_replace('[ß]',               'b', $sToClean);
        $sToClean = mb_ereg_replace('[çÇ]',              'c', $sToClean);
        $sToClean = mb_ereg_replace('[Ð]',               'd', $sToClean);
        $sToClean = mb_ereg_replace('[éèêëÉÊËÈ]',        'e', $sToClean);
        $sToClean = mb_ereg_replace('[ïîìíÏÎÌÍ]',        'i', $sToClean);
        $sToClean = mb_ereg_replace('[ñÑ]',              'n', $sToClean);
        $sToClean = mb_ereg_replace('[öôóòõÓÔÖÒÕ]',      'o', $sToClean);
        $sToClean = mb_ereg_replace('[Šš]',              's', $sToClean);
        $sToClean = mb_ereg_replace('[ùûüúÜÛÙÚ]',        'u', $sToClean);
        $sToClean = mb_ereg_replace('[¥ŸÝŸýÿ]',          'y', $sToClean);
        $sToClean = mb_ereg_replace('[Žž]',              'z', $sToClean);
     
        return $sToClean;
    }
     
    # 
    # strLight(string $str, array $words, string $startTag, string $endTag)  
    # 
    # Applique les tags $startTag et $endTag aux mots trouvés dans la chaine $str
    # Retourne la chaine formatée avec les nouveaux tags
    # 
    function strLight($str, $words, $startTag, $endTag)
    {    
        $encoding   = 'UTF-8';
        $original 	= $str;	
    	$str 		= mb_strtolower(cleanAccent($str), $encoding);
    	$tagLen 	= (mb_strlen($startTag, $encoding) + mb_strlen($endTag, $encoding));
     
    	foreach($words as $word)
    	{		
    		$word	 = mb_strtolower(cleanAccent($word), $encoding);
    		$current = $offset = $delta = 0; 
    		$len 	 = mb_strlen($word, $encoding);
     
    		while(( FALSE !== ($pos = mb_strpos($str, $word, $offset, $encoding))))
    		{
    			$original  = mb_substr($original, 0, ($pos + $delta), $encoding)
                            .$startTag.mb_substr($original, ($pos + $delta), $len, $encoding).$endTag
                            .mb_substr($original, ($pos + $delta + $len), mb_strlen($original) - ($pos + $delta + $len), $encoding);
     
    			$delta    += $tagLen; // Rajout de la longueur de chaine des tags  
    			$offset    = $pos + 1;			
    		}
    	}
     
    	return $original;
    }
     
    $words 		= array('methode','Vérite');
    $str   		= 'La vérité sur les méthodes. Méthode avec des majuscules ? Méthodologique ne match pas. Et methode sans accents ?';   
    $startTag 	= '<b>';
    $endTag 	= '</b>';
     
     
    echo strLight($str, $words, $startTag, $endTag);

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2008
    Messages : 12
    Par défaut
    Salut,

    fonction beaucoup plus simple....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    $data = $_POST['search'];
    str_ireplace($data,'<span style="background-color:yellow">'.$data.'</span>','donnée de ta mysql' )
    str_ireplace = insensible à la casse
    str_replace = sensible à la casse

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 72
    Par défaut
    Oui, mais ça ne fait pas la même chose, il faut comprendre que j'ai besoin de mettre en surbrillance un terme avec accents ou sans accents, dans un texte avec accent ou sans accent.

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

Discussions similaires

  1. Formulaire - Mise en surbrillance enregistrement
    Par Michel Hubert dans le forum Access
    Réponses: 18
    Dernier message: 14/05/2006, 21h02
  2. Mise en surbrillance de l'enregistrement
    Par lerico dans le forum Access
    Réponses: 2
    Dernier message: 10/03/2006, 16h12
  3. [VB6] DbGrid : Mise en surbrillance d'une ligne
    Par badgam piero dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 19/12/2005, 09h58
  4. Enlever la surbrillance lors d'une recherche avec vi
    Par sekiryou dans le forum Applications et environnements graphiques
    Réponses: 8
    Dernier message: 04/03/2004, 13h55

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