Souci avec str_replace

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Souci avec str_replace

Re: Souci avec str_replace

par Saian » 08 sept. 2022, 13:30

J'ai mis 2 listes pour voir avec ton code et sa fonctionne. En quoi considères tu que ça ne fonctionne pas ?

J'ai quand même tenté de faire une fonction mais tout comme ton code elle remplace tout en un appel.
function replaceKeywords($content) {
    return preg_replace_callback('/\{motscles=(.*)\}/Ui', static function ($matches) {
        $escapedWords = array_map(
            static function ($item) { return "|$item|"; },
            explode(',', $matches[1])
        );

        $replacements = array_fill(
            0,
            count($escapedWords),
            '<div class="mesmc">&nbsp;&nbsp;<i class="fas fa-check top-6"></i>%s<img src="class-txt-img.php?img=%s"/></div>'
        );

        $num = 0;
        $replacements = array_map(static function ($item) use (&$num) {
            ++$num;
            return sprintf($item, 1 === $num ? '&nbsp;&nbsp;' : '', $num);
        }, $replacements);

        return str_replace(
            $escapedWords,
            $replacements,
            implode('', $escapedWords)
        );
    }, $content);
}

$contenu3 = '{motscles=Jean, Paul, Pierre, Jean Jacques, Romain, Pierre Henri}
{motscles=Jean, Paul, Pierre, Jean Jacques, Romain, Pierre Henri}';

echo replaceKeywords($contenu3);

EDIT : si tu souhaites que la variable img soit égale au mot clé (vu le script txt-img.php), la fonction corrigée (et effectivement j'ai vu qu'avec plusieurs listes de mots clés différents ton code ne fait pas tout le job) :
function replaceKeywords($content) {
    return preg_replace_callback('/\{motscles=(.*)\}/Ui', static function ($matches) {
        $words = explode(',', $matches[1]);

        $replacements = array_map(static function ($index, $word) {
            return sprintf(
                 '<div class="mesmc">&nbsp;&nbsp;<i class="fas fa-check top-6"></i>%s<img src="class-txt-img.php?img=%s" /></div>',
                0 === $index ? '&nbsp;&nbsp;' : '',
                urlencode(trim($word))
            );
        }, array_keys($words), $words);

        return implode('', $replacements);
    }, html_entity_decode($content));
}

$content = '{motscles=Jean, Paul, Pierre, Jean Jacques, Romain, Pierre Henri}
{motscles=Riri, Fifi, Loulou, Donald, Mickey}';

echo replaceKeywords($content);

PS : à noter, avec l'utilisation du urlencode il faudrait que dans txt-img.php tu utilises urldecode sur get img.

Du coup j'ai fait mumuse et j'ai corrigé le script de génération des images :
<?php

$text = $_GET['img'] ?? null;

if (!$text) {
    exit;
}

$text = html_entity_decode(urldecode($text));
$font = 4;
$image = imagecreate(imagefontwidth($font) * strlen($text), imagefontheight($font));
imagecolorallocate($image, 255, 255, 255);
$black = imagecolorallocate($image, 0, 0, 0);
imagestring($image, $font, 0, 0, $text, $black);

header("Content-type: image/png");
echo imagepng($image);

La génération d'image avec imagettftext pour supporter les caractères spéciaux :
<?php

$text = $_GET['img'] ?? null;

if (!$text) {
    exit;
}

$text = html_entity_decode(urldecode($text));

putenv('GDFONTPATH=' . realpath('.'));
$fontName = 'Arial.ttf';
$fontSize = 11;

$box = imagettfbbox($fontSize, 0, $fontName, $text);
$min_x = min([$box[0], $box[2], $box[4], $box[6]]);
$max_x = max([$box[0], $box[2], $box[4], $box[6]]);
$width = ($max_x - $min_x);
$height = $fontSize * 1.6;

$image = imagecreatetruecolor($width, $height);
$white = imagecolorallocate($image, 255, 255, 255);
$black = imagecolorallocate($image, 0, 0, 0);

imagefilledrectangle($image, 0, 0, $width, $height, $white);
imagettftext($image, $fontSize, 0, 0, $fontSize + 1, $black, $fontName, $text);

header("Content-type: image/png");
imagepng($image);
imagedestroy($image);

Re: Souci avec str_replace

par vangardis » 08 sept. 2022, 09:15

Bonjour Saian.

Finalement j'ai réussi à adapter votre code à mes nécessités.

Code : Tout sélectionner

<?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); $debut = $outmotscles[1]; $mesmotscles = $outmotscles[2]; $fin = $outmotscles[3]; $contenu3 = str_replace($debut,"",$contenu3); $contenu3 = str_replace($fin,"",$contenu3); $tableau = array_map( static function ($item) { return "|$item|"; }, explode(',', $mesmotscles) ); $messorties=array(); $numberMC = 0; foreach ( $tableau as $monMC ) { $monMC = str_replace('|','',$monMC); $numberMC++; $messorties[$numberMC] = $monMC; } @session_start(); $_SESSION['images']=$messorties; $numberMC2 = 0; $tableau2= array(); foreach ( $tableau as $monMC2 ) { $numberMC2++; $tableau2[]='<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>'; } //print_r ($tableau2); $contenuX = str_replace($tableau,$tableau2,implode(',', $tableau)); $contenuX2 = str_replace(',','',$contenuX); $contenu3 = str_replace($outmotscles,$contenuX2,$contenu3); echo $contenu3; ?>
Me permet bien de créer la liste de mots-images dont j'ai besoin.

MILLE MERCIS POUR LE COUP DE MAIN.

Une dernière question: Dans mon cas, ça fonctionnera avec une liste {motscles=Jean, Paul, Pierre, Jean Jacques, Romain, Pierre Henri} mais pas avec plusieurs.

Serait-il possible de créer quelque chose comme une fonction?

Re: Souci avec str_replace

par vangardis » 07 sept. 2022, 19:34

Bonsoir Saian et merci pour cette réponse.
ça me permet d'y voir un peu plus clair mais je n'arrive pas ) mixer ça avec ce que je suis en train d'essayer de faire.

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

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 : Tout sélectionner

<?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 : Tout sélectionner

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 je n'ai pas de mots en doublon, ça fonctionne, mais dès qu'il y a des "Jean Paul" ça écrit Jean en image et Paul en texte.

Le truc c'est que je ne vois pas comment adapter votre solution à mon problème...

auriez-vous la sympathie de me corriger ça?

Re: Souci avec str_replace

par Saian » 07 sept. 2022, 18:46

Salut, une solution :
$liste = "Jean, Pierre, Paul, Jean Jacques, Martin";
$liste2 = "1, 2, 3, 4, 5";

$tableau = array_map(
    static function ($item) { return "|$item|"; },
    explode(',', $liste)
);
$tableau2 = explode(',', $liste2);

$liste = str_replace(
    $tableau,
    $tableau2,
    implode(',', $tableau)
);

echo $liste;

Souci avec str_replace

par vangardis » 07 sept. 2022, 17:32

Bonjour.

Je suis en train de bosser sur un projet un peu compliqué, je vais essayer d'en extraire mon souci histoire de ne pas remplir ce post avec des 10e de lignes de code.

En gros voici mon problème:

Si j'ai:

Code : Tout sélectionner

$liste = "Jean, Pierre, Paul, Jean Jacques, Martin"; $tableau = explode(',', $liste); $liste2 = "1, 2, 3, 4, 5"; $tableau2 = explode(',', $liste2); $liste = str_replace($tableau,$tableau2,$liste); echo $liste;
ça me renvoie:
1, 2, 3, 1 Jacques, 5
car "Jean" a deja été remplacé ...

T a-t il une solution pour que les éléments soient remplacés "dans l'ordre" et que "Jean Jaques" soit remplacé par "4"?