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 :

Tableaux, foreach et remplacements


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mai 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Mai 2022
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Tableaux, foreach et remplacements
    Bonjour.

    Je suis en train d'essayer de mettre en place un script pour remplacer dans un texte, un contenu entre {} par une série d'images.
    En gros: bla bla bla {Jean, Pierre, Paul, Jean Jacques, Martin} Blabla
    doit remplacer Jean, Pierre, Paul, Jean Jacques, Martin par des images

    La partie de script pour générer les images je suis OK Mon souci est que si dans ma liste j'ai des noms composés, ça plante

    En gros:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $liste  = "Jean, Pierre, Paul, Jean Jacques, Martin";
    $tableau = explode(',', $liste);
     
    $number = 0;
     
    foreach ( $tableau as $monMtableau ) {
    $number++;
    $liste = str_replace($monMtableau,'Nombre = '.$number.'<br />',$liste);
    }
    Quand je echo $liste;
    ça donne:

    Nombre = 1
    Nombre = 2
    Nombre = 3
    Nombre = 1 Jacques
    Nombre = 5

    Comment faire pour que ça renvoie
    Nombre = 1
    Nombre = 2
    Nombre = 3
    Nombre = 4
    Nombre = 5

  2. #2
    Membre confirmé Avatar de licardentaistor
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2021
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2021
    Messages : 315
    Points : 452
    Points
    452
    Par défaut
    si vous rajouter un explode dans la boucle (explode(" ", $montableau)) ça devrait le faire.

  3. #3
    Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mai 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Mai 2022
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Bonjour licardentaistor

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $liste  = "Jean, Pierre, Paul, Jean Jacques, Martin";
    $tableau = explode(',', $liste);
     
    $number = 0;
     
    foreach ( $tableau as $monMtableau ) {
    explode(" ", $monMtableau);
    $number++;
    $liste = str_replace($monMtableau,'Nombre = '.$number.'<br />',$liste);
    }
    echo $liste;
    renvoie toujours

    Nombre = 1
    Nombre = 2
    Nombre = 3
    Nombre = 1 Jacques
    Nombre = 5

    Hélas....

  4. #4
    Membre confirmé Avatar de licardentaistor
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2021
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2021
    Messages : 315
    Points : 452
    Points
    452
    Par défaut
    non mais je donne l'idée .... pas le code complet, il ne suffit pas de recopier bêtement ce que je dit et ne rien comprendre..

    si je vous conseille de refaire un explode avec un espace comme séparateur c'est pour traiter les cas des noms composés, à la place d'incrémenter $number il faut mettre la taille du tableau que renvoi explode.

  5. #5
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 402
    Points : 4 837
    Points
    4 837
    Par défaut
    Bonjour,

    Pourquoi ne pas utiliser les clés du tableau ? :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $tableau = explode(',', $liste);
    $remplacements=implode("<br />",array_map(function($index,$value){return "Nombre=".($index+1);},array_keys($tableau),$tableau));
    echo $remplacements;

  6. #6
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 232
    Points : 15 525
    Points
    15 525
    Par défaut
    le souci n'est pas le nom composé mais le fait que Jean Jacques contienne la chaine Jean. donc au 1er passage, les 2 "Jean" sont remplacés.

    peut-être que vous pouvez éviter cela en commençant par remplacer les chaines les plus grandes mais cela dépend du reste de votre code.

  7. #7
    Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mai 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Mai 2022
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Bonjour mathieu.
    Je voulais éviter de poster tout le code, histoire de ne pas polluer le forum mais je crois que je ne vais pas pouvoir y réchapper.

    ** attention, c'est du bidouillage, je suis sur qu'il y a des énormités, mais je débute vraiment...

    En gros, je souhaite dans un article (blog ou page quelconque) qui serait posté sur une page de site, pouvoir transformer une liste de mots clés de cet article en images (dans lesquelles sont écrites ces mots clés). en effet, je ne souhaite pas que Google "lise" ces mots clés spécifiques.

    J'ai donc prévu, quand je poste mon texte de pouvoir écrire une partie de cette façon: {motscles=Jean, Pierre, Paul, Jean Jacques, Martin}
    et ensuite, dans le fichier php qui lit le texte, de pouvoir isoler ce qui est entre {motscles= et }

    Pour celà, je dispose d'un fichier txt-img.php

    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
    <?php
    ob_start();
    @session_start();
    header ("Content-type: image/png");
    $text=$_SESSION['images'][$_GET['img']];
    if($text=='')
     exit;
     
     $tab1 = array("&amp;","&eacute;","&quot;","'","&agrave;","&acirc;","&ecirc;","&icirc;","&ocirc;","&ucirc;","&auml;","&euml;","&iuml;","&ouml;","&uuml;","&Acirc;","&Ecirc;","&Icirc;","&Ocirc;","&Ucirc;","&Auml;","&Euml;","&Iuml;","&Ouml;","&Uuml;","&ccedil;");
     $tab2 = array("&","é","\"","'","à","â","ê","î","ô","û","ä","ë","ï","ö","ü","Â","Ê","Î","Ô","Û","Ä","Ë","Ï","Ö","Ü","ç");
     
     $text = str_replace ($tab1,$tab2,$text) ;
     
    $string = utf8_decode($text);                                            
    $font   = 4;
    $width  = ImageFontWidth($font) * strlen($string);
    $height = ImageFontHeight($font);
     
    $im = @imagecreate ($width,$height);
    $background_color = imagecolorallocate ($im, 255, 255, 255); //white background
    $text_color = imagecolorallocate ($im, 0, 0,0);//black text
    imagestring ($im, $font, 0, 0,  $string, $text_color);
    echo imagepng ($im);
    ?>
    Et dans le fichier de lecture de ma page, le texte étant appelé $contenu3

    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
    preg_match("#({motscles=)(.*)(})#Ui",$contenu3,$outmotscles);	
    preg_match("#({motscles=)(.*)(})#Ui",$contenu3,$outmotscles2);
     
    $debut = $outmotscles[1];
    $mesmotscles = $outmotscles[2];
    $fin = $outmotscles[3];
     
    $contenu3 = str_replace($debut,"",$contenu3);
    $contenu3 = str_replace($fin,"",$contenu3);
     
    $fn_listeMC = explode( ',', $mesmotscles );
     
     
    $mesmotscles2 = $outmotscles2[2];
    $mesmotscles2 = str_replace(',','',$mesmotscles2);
     
     
    $contenu3 = str_replace($mesmotscles,$mesmotscles2,$contenu3);
     
     
    $messorties=array();
    $numberMC = 0;
     
    foreach ( $fn_listeMC as $monMC ) {
    $numberMC++;
    $messorties[$numberMC] = $monMC;
    }
    @session_start();
    $_SESSION['images']=$messorties;
     
    $numberMC2 = 0;
     
    foreach ( $fn_listeMC as $monMC2 ) {
    $numberMC2++;
     
    $contenu3 = str_replace($monMC2,'<div class="mesmc">&nbsp;&nbsp;<i class="fas fa-check top-6"></i>'.($numberMC2 == 1?'&nbsp;&nbsp;':'').'<img src="modules/page/txt-img.php?img='.$numberMC2.'" /></div>',$contenu3);
    }
    tant que j'ai des mots différents dans ma liste, tout fonctionne, ma page affiche bien des images avec le texte écrit dedans à la place des mots, mais dès que j'ai cette histoire du Jean et Jean Paul, vu que Jean a déjà été remplacé, ça plante.

  8. #8
    Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mai 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Mai 2022
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Pour simplifier la visualisation j'ai mis le truc en ligne:

    Code:

    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
    <?php
     
    $contenu3 ='<p>Lorem ipsum dolor sit amet. Ut neque voluptas ex maxime numquam sit soluta saepe et enim possimus qui quos fuga. Eum expedita doloribus eaque fugit et ducimus consequatur in similique doloremque. Aut sapiente dolores quo Quis recusandae aut expedita quidem eos quidem deleniti est excepturi libero. Qui aliquid consequuntur et inventore Quis nam eligendi possimus aut expedita enim qui quae autem quo explicabo commodi.</p>
    
    {motscles=Jean, Paul, Pierre, Jean Jacques, Romain, Pierre Henri}
    
    <p>Aut velit animi et exercitationem accusamus eos fugiat doloribus ut facere dolorem est voluptas consequuntur aut veritatis sunt ea repellat molestias. Et mollitia dolorem aut nostrum consectetur et inventore dicta quo tenetur earum eum saepe nostrum. Eum nihil ipsa eos galisum officiis vel laudantium sunt vel distinctio voluptatem et galisum commodi sed officiis quisquam est repudiandae obcaecati. Aut ducimus voluptatem qui consequuntur autem ut ratione autem et eaque molestias?</p>
    
    <p>Ab repellat est dolorem deserunt qui quasi voluptatem et vero quibusdam sit odit pariatur. Vel accusantium expedita ut sint praesentium vel saepe dignissimos. Aut quia facilis aut repellendus voluptate sed perferendis rerum.</p>
    ';
     
     
     
     
     
     
     
     
     
     
     
     
    preg_match("#({motscles=)(.*)(})#Ui",$contenu3,$outmotscles);	
    preg_match("#({motscles=)(.*)(})#Ui",$contenu3,$outmotscles2);
     
    $debut = $outmotscles[1];
    $mesmotscles = $outmotscles[2];
    $fin = $outmotscles[3];
     
    $contenu3 = str_replace($debut,"",$contenu3);
    $contenu3 = str_replace($fin,"",$contenu3);
     
    $fn_listeMC = explode( ',', $mesmotscles );
     
     
    $mesmotscles2 = $outmotscles2[2];
    $mesmotscles2 = str_replace(',','',$mesmotscles2);
     
     
    $contenu3 = str_replace($mesmotscles,$mesmotscles2,$contenu3);
     
     
    $messorties=array();
    $numberMC = 0;
     
    foreach ( $fn_listeMC as $monMC ) {
    $numberMC++;
    $messorties[$numberMC] = $monMC;
    }
    @session_start();
    $_SESSION['images']=$messorties;
     
    $numberMC2 = 0;
     
    foreach ( $fn_listeMC as $monMC2 ) {
    $numberMC2++;
     
    $contenu3 = str_replace($monMC2,'<div class="mesmc">&nbsp;&nbsp;<i class="fas fa-check top-6"></i>'.($numberMC2 == 1?'&nbsp;&nbsp;':'').'<img src="class-txt-img.php?img='.$numberMC2.'" /></div>',$contenu3);
     
    }
     
    echo $contenu3;
     
     
    ?>

    Résultat: https://lizzaci.com/test-liste.php

  9. #9
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 402
    Points : 4 837
    Points
    4 837
    Par défaut
    Bonjour,

    Code testé et fonctionnel :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $contenu='<p>le texte........</p>{motscles=Jean, Paul, Pierre, Jean Jacques, Romain, Pierre Henri} encore du texte......';
    $debut=stripos($contenu,"{motscles=");
    $fin=stripos($contenu,"}")+1;
    preg_match("#(?<={motscles=).*(?=})#",$contenu,$names);
    $names=explode(",",$names[0]);
    $_SESSION['images']=$names;
    $names=array_map('trim',$names);
    $contenu=substr($contenu,0,$debut)
    .implode('',array_map(function($index,$name){return "<div class='mesmc'>&nbsp;&nbsp;<i class='fas fa-check top-6'></i>"
    	.($index == 1?'&nbsp;&nbsp;':'')."<img src='class-txt-img.php?img=".$index."' /></div>";},array_keys($names),$names))
    .substr($contenu,$fin);
    echo $contenu;

  10. #10
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Je l'écrirais comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $keywords = ['Jean' => 0, 'Paul' => 1, 'Pierre' => 2, 'Jean Jacques' => 3, 'Romain' => 4, 'Pierre Henri' => 5];
    $format = '<div class="mesmc"><i class="fas fa-check top-6"></i><img src="class-txt-img.php?img=%s" /></div>';
     
    echo preg_replace_callback(
        '~ (?:  \G (?<= [^}] ) ,  |  {motscles= (?= [^}]* } )  ) 
           \s* ( [^,}]* [^,}\s] ) \s* }? ~x',
        fn($m) => isset($keywords[$m[1]]) ? sprintf($format, $keywords[$m[1]]) : $m[1],
        $contenu
    );
    preg_replace_callback permet d'effectuer un remplacement en fonction de la correspondance (du match).

    Ici la pattern regex est à "double entrée":
    • La première branche: \G (?<= [^}] ) ,
    • et la seconde: {motscles= (?= [^}]* } )
    . La suite est commune au deux branches. La première branche commence par l'ancre \G (G pour "glue"), ancre qui ne réussira qu'à une position suivant immédiatemment une autre correspondance. Son rôle est donc de choper tous les mots-clefs d'une série sauf le premier. Le privilège du premier mot-clef revient à la seconde branche qui détectera le préfixe {motscles= et vérifira dans un test avant (un lookahead) qu'il se conclue bien par une accolade fermante.

    La suite commune (en facteur) aux deux branches \s* ( [^,}]* [^,}\s] ) \s* }? permet d'isoler le mot clef (grace aux parenthèses) dans le groupe de capture 1. Les caractères exclus des classes de caractères [^,}] et [^,}\s], avec les espaces blancs optionnels \s* autour, sont choisis de manière à éviter de faire un trim.

    L'accolade optionnelle }? permet de consommer l'accolade fermante suite au dernier mot clef. À noter que la première branche vérifie que la position est précédée par un caractère qui n'est pas une accolade (?<= [^}] ) (ce qui permet d'arrêter les remplacements jusqu'à ce que de nouveau, la seconde branche réussisse).

    Je me suis permis d'enlever les &nbsp; du remplacement, en effet tu peux très bien utiliser des padding en css sur la classe mesmc pour ménager un espace.

    À propos de ton code précédent:
    • pour remplacer les entités html, jette un œil à la fonction html_entity_decode.
    • arrange toi pour ne jamais nommer une variable $nomdevariable3 ou n'importe quel autre chiffre. (soit ça ne sert à rien, soit tu as besoin d'un tableau).
    • UTF-8 est la norme en matière d'encodage de caractères, donc au lieu d'utiliser utf8_decode, il faut que tes noms de fichiers soient encodés en UTF-8. (à noter que cette fonction sera obsolète dans la prochaine version de PHP (la 8.2))
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. [Tableaux] foreach avec tableau variable
    Par NerOcrO dans le forum Langage
    Réponses: 2
    Dernier message: 23/05/2007, 11h13
  2. [Tableaux] Foreach renvoie des valeurs double en php4
    Par Dantahoua dans le forum Langage
    Réponses: 5
    Dernier message: 10/04/2007, 17h49
  3. [Tableaux] Faire un remplacement dans une chaîne
    Par méphistopheles dans le forum Langage
    Réponses: 4
    Dernier message: 19/12/2006, 21h31
  4. [Tableaux] foreach() et tableau
    Par Blaireau dans le forum Langage
    Réponses: 4
    Dernier message: 07/08/2006, 16h11
  5. [Tableaux] Problème avec remplacement dans chaîne
    Par Baptiste Wicht dans le forum Langage
    Réponses: 5
    Dernier message: 13/07/2006, 10h04

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