[parser php] remplacement automatique

Edouard -  
kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour à tous,

Je recherche un script php qui permet de parser des chaines de caractères issues d'une requete mysql et de remplacer certains mots par quelquechose de ce type <a href...>mot</a>.

Je pense que ça existe pour générer automatiquement des infosbulles à partir d'une table (Mot à remplacer | lien de l'infobulle), mais sur Google, je ne trouve pas les bons mots clés.

Merci d'avance.

Edouard

13 réponses

  1. Edouard
     
    Voilà le code fonctionnel.

    Attention j'appel certaines fonctions qui ne sont pas présente dans ce script, pas le temps et confidentialité oblige, mais ça donne une bonne idée de comment faire...

    voici le structure de la table
    CREATE TABLE `annuaire` (
    `id` INT NOT NULL AUTO_INCREMENT ,
    `motcle` VARCHAR( 20 ) NOT NULL ,
    `infobulle` VARCHAR( 100 ) NOT NULL ,
    `url` VARCHAR( 100 ) NOT NULL ,
    `target` INT( 1 ) NOT NULL ,
    PRIMARY KEY ( `id` ) 
    );


    et voici le code php
    // Requête de remplacement
    $sqlreplace=mysql_query("select* from annuaire");
    $nbrlignesqlreplace=mysql_num_rows($sqlreplace);//nombre de ligne
    if ($nbrlignesqlreplace=="0"){
    echo AuStripSlashes("Il n'y a pas de données de remplacement !");
    }//fin if
    else{
    while ($rowsqlreplace=mysql_fetch_array($sqlreplace))
    {
    // récupération des valeurs ligne à ligne
    $Id_replace=$rowsqlreplace["id"];
    $motcle_replace=$rowsqlreplace["motcle"];
    $infobulle_replace=AuAddSlashes($rowsqlreplace["infobulle"]);//pour ne pas être ennuyé par les apostrophes
    $url_replace=$rowsqlreplace["url"];
    $target_replace=$rowsqlreplace["target"];
    //affectation des colonnes dans les tableaux 'SEARCH'
    $SEARCH[]=$motcle_replace;
    
    //affectation des colonnes dans les tableaux 'REPLACE'
    if($target_replace=="1"){
    // on utilise un target blank
    $lieninfobulle="<a target=\"_blank\" href=\"".$url_replace."\" OnClick=\"PopItUp('addfolder.php',500,200);\" OnMouseOver=\"BulleWrite('".$infobulle_replace."');\" OnMouseOut =\"BulleHide ();\">".$motcle_replace."</a>";
    $REPLACE[]=$lieninfobulle;
    }//fin if
    else{
    // on ouvre le lien dans la même page
    $lieninfobulle="<a href=\"".$url_replace."\" OnClick=\"PopItUp('addfolder.php',500,200);\" OnMouseOver=\"BulleWrite('".$infobulle_replace."');\" OnMouseOut =\"BulleHide ();\">".$motcle_replace."</a>";
    $REPLACE[]=$lieninfobulle;
    }//fin else
    // ensuite on appliquera le remplacement de mot dans les chaines aux variables issues de la seconde requête
    }//fin while
    }//fin else
    
    // Création de la requete sql
    $sql=mysql_query("select * from actualites $clause");
    $nbrligne=mysql_num_rows($sql);//nombre de ligne
    if ($nbrligne=="0"){
    echo AuStripSlashes("Il n'y a pas d'actualités dans la base de données.");
    }
    else{
    while ($row=mysql_fetch_array($sql))
    {
    $Id_actualite_ligne=$row["Id_actualite"];
    $Titre_actualite_ligne=$row["Titre_actualite"];
    $Date_actualite_ligne=$row["Date_actualite"];
    // formatage de la date
    ...
    $Texte_actualite_ligne=str_replace($SEARCH, $REPLACE, $row["Texte2_actualite"]);
    
    ... ensuite le script continue, il suffit de ce code pour afficher le texte modifié
    echo"$Texte_actualite_ligne";
    2
  2. kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention   1 526
     
    Pour ignorer la casse, fait ça au niveau de ta requête:
    SELECT LOWER(champs).....


    EDIT: Ah mais chuis bête, ça changera pas ton texte de départ.... :-/
    2
  3. kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention   1 526
     
    Ben globalement, tu as besoin de str_replace
    http://fr2.php.net/manual/fr/function.str-replace.php
    qui s'utilise comme ça:
    $nouvelle_chaine = str_replace('mot_à_replacer', 'mot_de_remplacement', $ancienne_chaine);

    Après il faut voir selon le contexte.
    0
  4. edouard
     
    si je te suis :
    je fais une requête pour chercher dans ma bdd mysql tous les couples 'mot à remplacer' / 'mot de remplacement', que je met par exemple dans un tableau,
    puis je fais une requête pour extraire les chaines de caractère originelles,
    enfin je fais deux boucles imbriquées pour remplacer chaine par chaine puis mot par mot les bout de chaine ?

    En terme de performance, j'ai peur que la page mette du temps à s'afficher s'il y a de longues chaines et pas mat de mots à remplacer ?

    qu'en penses tu ?

    Edouard
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention   1 526
     
    Il ya beaucoup de mots à remplacer dans la table de remplacement?

    Parce que tu n'as qu'un appel de str_replace à faire, même pas besoin de passer par une boucle.
    Tiens regarde cet exemple tiré du site de php:
    // Génère : Vous devriez manger des pizzas, des glaces et des gâteaux tous les jours.
    $phrase  = "Vous devriez manger des fruits, des légumes et des fibres tous les jours.";
    $regime = array("fruits", "légumes", "fibres");
    $bonne_chere   = array("pizzas", "glaces", "gâteaux");
    
    echo $newphrase = str_replace($regime, $bonne_chere, $phrase);
    0
  7. Edouard
     
    j'étais en train de me pencher sur cette histoire de tableau dans ton premier lien.

    Le remplacement se fait par ordre ET selon l'index auto du tableau ? (merci de confirmer)

    Si c'est le cas, ça doit fonctionner, (je pense pas qu'il y aura plus de 200 mots dans mon 'index').

    Le but en fait c'est de retrouver des mots qui ont une définition dans une table et de les remplacer automatiquement par le mot encadré d'un lien avec une infobulle.

    Merci, je publierai le code quand il sera fait (même si c'est pas compliqué) pour faciliter la vie aux autres.

    Edouard
    0
  8. kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention   1 526
     
    Oui ça se fait par ordre de même index entre $regime et $bonne_chere.
    $regime[0] sera remplacé par $bonne_chere[0]
    $regime[1] sera remplacé par $bonne_chere[1] etc...

    200 mots c'est quand même beaucoup.
    Bon il faut voir, ce sera sûrement négligeable dans le temps d'execution de ton script....
    0
  9. Edouard
     
    je teste dans 10 minutes et je te dis
    0
  10. kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention   1 526
     
    Merci :-)
    0
  11. Edouard
     
    A améliorer en implémentant la gestion de la "casse".

    Pour l'instant si le mot commence par une majuscule, il ne sera pas reconnu, idem pour les accents,...

    Je vais voir si on peut faire ça intéligement via des paramètres dans ma table annuaire
    (booléen du type 'ignorer la casse' ; 'ignorer les accents' ...)

    Je reposterai en fin de semaine.

    Edouard

    http://www.promete.fr
    0
  12. Edouard
     
    pas possible sinon ça va modifier le texte à afficher (on aurait également pu avec php).

    il existe une fonction str_ireplace en php5, mais faut que je passe à easy php2...
    0
  13. Edouard
     
    str_ireplace çà trouve bien toutes les occurences (y compris quand la chaine de caractère recherché fait partie d'un mot) mais ça a le même effet que LOWER.

    Dans mon cas :

    Musées devient musées
    musée devient musée
    et Musée devient musée

    Ce qui fait quand même bizarre à la lecture... lol

    En fait je voudrais appliquer le remplacement avant et après l'occurence mais ne pas modifier la dite chaine de caractère.

    Je crois que preg_replace est une piste, mais je galère (comme à chaque fois avec les regex...)

    Enfin, il est l'heure, je me casse.

    A+

    Edouard
    0
  14. kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention   1 526
     
    Ben je t'avouerais que je suis pas assez chaud de la regexp pour t'aider là....
    0