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 :

Ma fonction snippet est incomplète et n'affiche pas la position comme souhaitée [PHP 7]


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Homme Profil pro
    HobbyWeb
    Inscrit en
    Janvier 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : HobbyWeb

    Informations forums :
    Inscription : Janvier 2005
    Messages : 183
    Par défaut Ma fonction snippet est incomplète et n'affiche pas la position comme souhaitée
    Bonjour,

    Il y a longtemps, on m'a aidé on me proposant cette fonction ci-dessous pour mon moteur de recherche, je me rends compte qu'elle incomplète sur un point précis. A toute fins utiles, le code ci dessous fonctionne en local tel quel, certainement plus facile pour comprendre mon pb live que mes explications..

    Pour afficher le résultat d'une recherche, je fais appel à deux fonctions pour mettre en surbrillance les termes recherchés et pour y afficher des bouts de phrases "snippet" (max 140 caractères pour un total max de 425 caractères, donc ~3 snippets de 140 caractères) qui sera la description à afficher dans mon résultat.

    Le problème rencontré est le suivant, si je cherche les termes "météo+toulouse" il va m'afficher une description avec 425 caractères et que le terme "météo" en surbrillance, il tient compte du terme toulouse mais ne l'affiche pas (testé avec ma BDD) alors que j'aimerais qu'il m'affiche au moins un snippet de chaque et pour le 3ème ben selon le terme trouvé le plus souvent entre météo et toulouse, en l'occurrence météo.. donc 2 snippets avec météo et 1 avec toulouse.

    But recherché : si un terme recherché à + de 3 mots du genre "météo+troyes+neige+la+prévision+toulouse", il devra garder maximum que les 3 termes retrouvés le plus souvent dans tout le texte, en l'occurrence, le mot "météo" (présent 18x), le mot "neige" (présent 7x), le mot "toulouse" (présent 3x), le mot "troyes" (présent 2x) et le mot "prévision" (présent 1x). Donc et pour cette exemple, la surbrillance devra se faire sur ces 3 mots présents le plus de fois météo+toulouse+neige ("la" faisant moins de 3 lettres n'est pas retenu..) et il devra y a afficher

    S'il y au minimum 3 mots et plus : "météo+troyes+neige+la+prévision+toulouse"

    un snippet avec au moins 1x le terme "météo" en surbrillance
    un snippet avec au moins 1x le terme "neige" en surbrillance
    un snippet avec au moins 1x le terme "toulouse" en surbrillance

    S'il y a 2 mots dans les termes "la+prévision+toulouse"

    un snippet avec au moins 2x le terme "toulouse" en surbrillance
    un snippet avec au moins 1x le terme "prévision" en surbrillance

    S'il n'y a pas assez de mots trouvés pour faire 3 snippets, afficher une description avec 425 caractères et au moins 1x le mot en surbrillance. (les 3 termes peuvent aussi se retrouver dans un seul snippet de 425 caractères..)

    Merci d'avance pour votre aide
    Yule

    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
     
    <?php 
    ini_set('error_reporting', E_ALL); ini_set('display_errors', 0);
    header('Content-type: text/html; charset=utf-8');
     
     
     
    // +------ Fonction pour supprimer les keywords de 3 lettres et moins  -------+ 		
    function RemoveLess($String,$Char=3) 
    {
        $StringArray=explode (" ",$String);
            foreach ($StringArray as &$Word) 
            {
                if (mb_strlen($Word,"UTF-8")>$Char)
                { 
                    $Str.=$Word." ";
                }
            }
        return trim($Str);
    }
     
    // +------ Fonction pour rechercher les keywords dans le texte et les afficher selon une position  -------+	
    function get_snippet($keywordsy, $texte) 
    {
        $snippet='';
        $span = 140;
        $strlen_max = 425;
     
        $keywordsy = RemoveLess($keywordsy); // appel de la 1ère fonction
        $keywordsy = preg_replace("#[\\\/:\*\?\(\)\%\&\+\#\"<>'\|]#ius", " ", $keywordsy) ; // Supprimer les caractères spéciaux
        $keywordsy =  trim(preg_replace("#( [[:alnum:]]{1,3} )#Ui", " ", " ".$keywordsy." ")); // ne garde que + de 3 caractères et ajout d'un espace avant et après		
     
        $texte = html_entity_decode("$texte", ENT_QUOTES); // Traiter le texte qui s'affiche selon les charset
     
        $words = implode('|', explode(' ', preg_quote($keywordsy)));
     
        preg_match_all("#(\W.{0,$span}\W)($words)(\W.{0,$span}\W)#ius", "  $texte  ", $matches);
     
        foreach($matches[0] as $match) 
        {
            if (!$match = trim($match)) continue;
            if (isset($snippet)) $snippet .= "$match.. "; else $snippet = "...$match...";
            if (mb_strlen($snippet.htmlspecialchars($match[0], ENT_QUOTES, 'UTF-8').".. ") > $strlen_max) break;
        }
            $snippet = preg_replace("#($words)#iu", '<b>$1</b>', $snippet);
            return $snippet;
      }
     
     
    $texte ="Météo France : La meilleure info météo GRATUITE à 15 jours - La Chaîne Météo Mes favoris édition mon compte Alerte Météo France Montagne Monde Voyage Plage Marine Direct TV Actualités Vidéos Reporters mon compte mon espace se déconnecter + - Actualités Météo 00h02 Neige au Nord, fortes précipitations et vents au Sud 00h00 Météo de ce week-end : neige en plaine, risque d'inondations au sud-ouest 00h00 Météo Vendée Globe : contournement de l'anticyclone des Açores ! 00h00 Météo de ce samedi 23 janvier : vent violent en Corse, neige dans le nord Toute l'actu 1 /4 SUIVRE Guide météo voyage Météo France Alerte Orange  - Neige au Nord, fortes précipitations et vents au Sud Consulter sur Toulouse l'alerte sam 23 janv. dim 24 janv. lun 25 janv. mar 26 janv. mer 27 janv. jeu 28 janv. ven 29 janv. sam 30 janv. dim 31 janv. lun 1 févr. mar 2 févr. mer 3 févr. jeu 4 févr. ven 5 févr. sam 6 févr. Sélectionnez votre massif Centre-Val de Loire Orléans Bourges Île-de-France Paris Pays de la Loire Nantes Provence-Alpes-Côte d'Azur Marseille Nice Corse Ajaccio Bretagne Rennes Brest Grand Est Strasbourg Troyes Charleville-Mézières Auvergne-Rhône-Alpes Lyon Montélimar Aurillac Bourgogne-Franche-Comté Dijon Nouvelle-Aquitaine Limoges Bordeaux La Rochelle Biarritz Occitanie Toulouse Montpellier Perpignan Normandie Rouen Cherbourg Hauts-de-France Lille Vents Décalage horaire : l'échéance demandée est déjà passée Ce Matin Cet Après-midi Ce Soir Cette Nuit Vents Le temps se refroidit.Une perturbation circule du sud-ouest au nord en apportant de la pluie parfois mêlée de neige jusqu'en plaine sur les régions du Nord. Un temps sec persiste quelques heures de la façade Est à la Méditerranée. Le vent souffle fort sur la côte aquitaine. Neige au Nord, intempéries en Corse : suivez l'évolution de la situation au 3201 * Bulletins Météo Météo du jour Bulletin France pour demain Météo week-end : plus froid, neige en plaine Météo à 4 semaines : tendance jusqu'au 21 février Prévisions saisonnières pour la suite de l'hiver et le printemps L'expertise météo , au coeur de l'info Application La Chaîne Météo Toute l'expertise de La Chaîne Météo concentrée dans son appli disponible sur smartphones et tablettes. Météo France Lyon Marseille Nice Paris Toulouse Beauvais Bobigny Épinal Poitiers Privas Saint-Brieuc Troyes";
     
    $keywordsy ="météo+toulouse+décalage+troyes"; //va afficher les 425 premier caractères ??? seul le terme météo est traité
    //$keywordsy ="troyes+météo"; // va aussi afficher les 425 premier caractères.. météo à trop de poids ?
    //$keywordsy ="troyes+pertubation"; // va afficher 2 phrases avec Troyes mais sans pertubation
    //$keywordsy ="troyes+toulouse"; // Coup de chance ? les deux termes sont présents
    //$keywordsy ="météo+toulouse+prévisions+neige"; //va afficher les 425 premier caractères ??? mais par chance 2 termes s'y trouvent, donc le hasard fait bien les choses mais c'est pas le but
     
    // Dans ce texte il y a : 18x météo, 7x neige, 3x toulouse, 2x troyes, 1x prévision et 1x décalage,
     
    $description = get_snippet($keywordsy, $texte);	
     
    echo"$description";
     
    ?>

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 709
    Par défaut
    si j'ai bien compris ce que vous voulez faire, cela devrait être faisable en stockant les extraits de texte dans un tableau associé à chaque mot.
    ensuite vous parcourez le tableau pour compter les éléments et choisir ceux qui sont les plus présents.

  3. #3
    Membre éclairé
    Homme Profil pro
    HobbyWeb
    Inscrit en
    Janvier 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : HobbyWeb

    Informations forums :
    Inscription : Janvier 2005
    Messages : 183
    Par défaut
    Exactement mais je ne sais pas vraiment faire cette maniclette....

    J'ai effectué plusieurs recherches en vain , espérant trouver des exemples permettant d'adapter à mes besoins. J'ai même retrouvé l'origine de cette partie de code ici . Mais rien d'autres , à me demander si j'utilise pas les bons termes dans mes recherches...

    Si je décompose avec ce que @Mathieu relève..

    • Avec un mot clef à la recherche, ça change rien au code ci-dessus
    • Avec 2 et plusieurs mots clefs à la recherche, il faudrait donc compter l'ensemble des mots clefs recherchés dans le texte et en extraire les 2 ou 3 mots clefs les plus souvent retrouvés



    Affichage :

    • Si un mot clefs recherché , ça change rien au code-dessus
    • Si deux mots clefs recherchés, afficher 2 bribes de texte avec le mot le plus souvent retrouvé + une bribe avec le second mot
    • Si 3 ou plusieurs mots clefs recherchés, afficher un bribe de chacun des 3 mots



    Ca serait possible ? Cas échéant comment procéderiez-vous .
    Merci d'avance (mes connaissances ne permettent pas d'aller aussi loin..)

    PAS RESOLU MAIS SUJET FERME POUR LE MOMENT

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

Discussions similaires

  1. [AC-2003] L'état n'affiche pas toutes les données souhaitées
    Par samogo dans le forum IHM
    Réponses: 6
    Dernier message: 15/10/2019, 16h50
  2. Programme fonctionne mais n'affiche pas ce que je souhaite
    Par LauraRL dans le forum Général Java
    Réponses: 2
    Dernier message: 03/04/2016, 23h50
  3. Les données d'un combo en fonction d'un checkbox ne s'affichent pas
    Par mialy.rakot dans le forum Ext JS / Sencha
    Réponses: 7
    Dernier message: 18/11/2010, 13h18
  4. div ne s'affiche pas entièrement (position absolute)
    Par anisj1m dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 18/08/2009, 14h12
  5. Réponses: 18
    Dernier message: 13/12/2005, 14h27

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