exercice Fonction de censure en PHP

Wazz9

Membre
Bonjour à toutes et à tous !

Le dernier exercice datant un peu je vous propose un nouvel opus.
Objectif : Créer une fonction de censure de lettres et de mots
Requis dans la fonction :
  • remplacer certaines lettres par des astérisques *
  • remplacer certains mots par d'autres
Texte de travail (extrait de Barbara de Jacques Prévert)
Rappelle-toi Barbara
Il pleuvait sans cesse sur Brest ce jour-là
Et tu marchais souriante
Épanouie ravie ruisselante
Sous la pluie
Rappelle-toi Barbara
Il pleuvait sans cesse sur Brest
Et je t’ai croisée rue de Siam
Tu souriais
Et moi je souriais de même
Rappelle-toi Barbara
Toi que je ne connaissais pas
Toi qui ne me connaissais pas
Rappelle-toi
Rappelle-toi quand même ce jour-là
N’oublie pas
Un homme sous un porche s’abritait
Et il a crié ton nom
Barbara
Et tu as couru vers lui sous la pluie
Ruisselante ravie épanouie
Et tu t’es jetée dans ses bras
  1. Chaque Barbara du texte devra être remplacé par Barbapapa
  2. Chaque lettre a du texte sera remplacé par un astérisque * sauf dans le mot Barbapapa
Délai de réalisation : 7 jours soit jusqu'à vendredi 12 Février

Le code produit par chaque participant devra être exécutable sur le PHP Try It de W3Schools.

Bonne chance à tous !
 

Ziggy

Membre
Du coup je me suis débrouillé avec la vidéo aussi, je pense que je suis prêt, probablement que le code n'est pas super beau mais il fonctionne.
A vendredi alors !
 

yule

Membre
Du coup je me suis débrouillé avec la vidéo aussi, je pense que je suis prêt, probablement que le code n'est pas super beau mais il fonctionne.
A vendredi alors !
L'essentiel est qu'il fonctionne ! Et ça c'est déjà une grosse satisfaction, nice !
S'agissant du code, qui pourrait se targuer de l'écrire "pil poil " juste... Il y aura toujours quelqu'un qui dira oui mais c'est mieux comme ca ou comme ci etc.. Je pars du principe que s'il fonctionne, j'essaye de l'améliorer au terme de l'objet codé en allant fouiller le net et essayer de comparer des exemples trouvés par ici et par la.
 
Dernière édition:

yule

Membre
Hola,

Voilà donc 2 solutions parmi bien d'autres

function php
//Chaque Barbara du texte devra être remplacé par Barbapapa
//Chaque lettre a du texte sera remplacé par un astérisque * sauf dans le mot Barbapapa

$texte ="
Rappelle-toi Barbara<br>
Il pleuvait sans cesse sur Brest ce jour-là<br>
Et tu marchais souriante<br>
Épanouie ravie ruisselante<br>
Sous la pluie<br>
Rappelle-toi Barbara<br>
Il pleuvait sans cesse sur Brest<br>
Et je t’ai croisée rue de Siam<br>
Tu souriais<br>
Et moi je souriais de même<br>
Rappelle-toi Barbara<br>
Toi que je ne connaissais pas<br>
Toi qui ne me connaissais pas<br>
Rappelle-toi<br>
Rappelle-toi quand même ce jour-là<br>
N’oublie pas<br>
Un homme sous un porche s’abritait<br>
Et il a crié ton nom<br>
Barbara<br>
Et tu as couru vers lui sous la pluie<br>
Ruisselante ravie épanouie<br>
Et tu t’es jetée dans ses bras";

// Version code
$texte1 = str_replace("a","*",$texte);                   // remplace tous les a par *
$texte2 = str_replace("B*rb*r*","Barbapapa",$texte1);    // remplace tous les B*rb*r* par Barbapapa

echo"<b>Version CODE</b><p>$texte2</p>";  // on affiche le résultat


// Version fonction
function censure($str)
        {
            $texte1 = str_replace("a","*",$str);
            $texte2 = str_replace("B*rb*r*","Barbapapa",$texte1);
            return $texte2;
        }
$newtexte = censure($texte);  // Appel à la function pour récupérer ensuite la nouvelle variable  

echo"<br><b>Version FUNCTION</b><p>$newtexte</p>"; // on affiche le résultat

2 lignes de code: 29 et 30... la 32 pour afficher le résultat

Pour la fonction, elle permettra de travailler sur plusieurs textes

Bonne bonne
Yule
 

Ziggy

Membre
Bon et bien j'ai fait pareil, mais c'est vrai qu'avec la vidéo c'était difficile de se tromper.
Mais ça m'a malgré tout permis de manipuler un peu de code PHP, c'était la première fois.
PHP
$lettre =  "a";
$mot = "b*rb*r*";

$texte = readline('entrez votre phrase: ');
$texte = str_replace($lettre, "*", $texte);
$texte = str_replace($mot, "barbapapa", $texte);

echo $texte;

J'ai essayé de ne faire qu'une ligne de code str_replace mais en vain
ceci ne fonctionne pas:
PHP
// test 1
$texte = str_replace($lettre, "*" && $mot, "barbapapa", $texte);

// test 2
$texte = str_replace($lettre, "*", $texte && $mot, "barbapapa", $texte);

Sinon à l'invite de commande "entrez votre phrase" je ne peux pas copier/coller le texte Barbara avec des sauts de lignes ça renvoie des erreurs dans terminal donc il faut rentrer le texte en une seule ligne.
 

Anthony

Membre
J'ai passé 10 minutes à comprendre pourquoi vos codes ne fonctionnaient pas dans mon VSCODE !!
Après j'ai compris... c'est pas du JS mais du PHP ! :rolleyes:
 

Nicolas

Membre actif
Hello, j'avoue je n'ai rien fait ! 😬
Mais au vu des deux derniers messages j'ai tenté quelque chose pour simplifier encore et j'ai utilisé les tableaux (array) et voilà mon/votre code
(hors concours)
PHP
$censure = ["a", "b*rb*r*"];

$texte = readline('entrez votre phrase: ');
$texte = str_replace($censure, ["*", "barbapapa"], $texte);

echo $texte;
 

yule

Membre
PAs un concours mais de trouver une bonne solution ;)

Sinon pas certain que ton code fonctionne et pour que ceux et celles qu'il veulent tester en ligne, le code doit fonctionner comme Wazz9 l'a précisé, ici PHP Tryit Editor v1.2

Donc ton code, ceci
PHP
<?php
$texte ="
Rappelle-toi Barbara<br>
Il pleuvait sans cesse sur Brest ce jour-là<br>
Et tu marchais souriante<br>
Épanouie ravie ruisselante<br>
Sous la pluie<br>
Rappelle-toi Barbara<br>
Il pleuvait sans cesse sur Brest<br>
Et je t’ai croisée rue de Siam<br>
Tu souriais<br>
Et moi je souriais de même<br>
Rappelle-toi Barbara<br>
Toi que je ne connaissais pas<br>
Toi qui ne me connaissais pas<br>
Rappelle-toi<br>
Rappelle-toi quand même ce jour-là<br>
N’oublie pas<br>
Un homme sous un porche s’abritait<br>
Et il a crié ton nom<br>
Barbara<br>
Et tu as couru vers lui sous la pluie<br>
Ruisselante ravie épanouie<br>
Et tu t’es jetée dans ses bras";

$censure = ["a", "b*rb*r*"];

$texte = str_replace($censure, ["*", "barbapapa"], $texte);

echo $texte;
?>

Donne ça (en jaune , c'est faux)

R*ppelle-toi B*rb*r*
Il pleuv*it s*ns cesse sur Brest ce jour-là
Et tu m*rch*is souri*nte
Ép*nouie r*vie ruissel*nte
Sous l* pluie
R*ppelle-toi B*rb*r*
Il pleuv*it s*ns cesse sur Brest
Et je t’*i croisée rue de Si*m
Tu souri*is
Et moi je souri*is de même
R*ppelle-toi B*rb*r*
Toi que je ne conn*iss*is p*s
Toi qui ne me conn*iss*is p*s
R*ppelle-toi
R*ppelle-toi qu*nd même ce jour-là
N’oublie p*s
Un homme sous un porche s’*brit*it
Et il * crié ton nom
B*rb*r*
Et tu s couru vers lui sous l pluie
Ruissel*nte r*vie ép*nouie
Et tu t’es jetée d*ns ses br*s


Mais bien vu l'idée du tableau !
 
Dernière édition:

Nicolas

Membre actif
Bien vu yule.
En fait le code fonctionne s'il n'y a qu'une fois Barbara dans la variable $texte
Sur VSCode j'ai fait le test sur une seule phrase et ça fonctionne mais si Barbara apparait une deuxième fois ça bloque.

Il faut que je modifie quelque chose pour que ça fonctionne sur tout le texte.

Capture d’écran 2021-02-12 165027.png
 

Wazz9

Membre
Comme la cavalerie, Wazz arrive après la bataille... J'ai COM-PLE-TE-MENT Zappé !!

Du coup j'ai essayé avec une boucle sur les conseils de DaCode mais je n'y arrive pas avec le mot, les lettres ça fonctionne mais s'il y a un mot dans le tableau str_replace ça bloque. Je ne sais pas pourquoi...

Par exemple ce code remplace bien tous les e par des * et les a par des #
Mais à chaque fois ça déconne si c'est un mot à remplacer par un autre mot. Bon c'est dans l'objectif de n'écrire qu'une ligne de code str_replace parce que les codes de Ziggy et yule fonctionnent correctement.
PHP
<?php

$censures =  ["e", "a"];
$texte = readline('entrez votre phrase: ');
    foreach ($censures as $censure) {
        $texte = str_replace($censures, ["*", "#"], $texte);
    }

echo $texte;
 

Nicolas

Membre actif
Sinon pas certain que ton code fonctionne
Il fonctionne parfaitement !! :D
Il y avait une erreur dans la déclaration de $censures : j'ai écrit $censures = ["e", "barbara"]; au lieu de $censures = ["e", "Barbara"];
Oublié de mettre la MAJUSCULE à Barbara !

PHP
<?php
$texte ="texte à censurer";

$censures =  ["e", "Barbara"];
$texte = readline('entrez votre phrase: ');
    foreach ($censures as $censure) {
        $texte = str_replace($censures, ["*", "barbapapa"], $texte);
    }

echo $texte;

Ou encore, pas besoin de la boucle foreach finalement
PHP
<?php
$texte ="texte à censurer";

$censure = ["a", "B*rb*r*"];
$texte = str_replace($censure, ["*", "barbapapa"], $texte);

echo $texte;
 
Dernière édition:

yule

Membre
Il fonctionne parfaitement !! :D
Hahaha (y) parfait ! Tu vois, tu étais démoralisé pour rien et tu en fais un autre version !

Mais attention, tu contournes la problématique des majuscules un peu trop simplement 😇 et l'exemple de Ziggy et le mien aussi ! Le fait qu'il n'y a pas de A majuscule ou un b minuscule à un des 3 Barbara nous a bien aidé !

Changez un b minuscule à un des 3 Barbara et changez un a minuscule à un A majuscule, aucun des codes ci-dessus fonctionnera..

la bonne fonction a utiliser est celle-ci str_ireplace et non celle-ci str_replace. Le i veut dire insensible à la casse, par conséquent, il se moque des minuscules et majuscules à l'entrée. Par contre à la sortie , c'est soit en minuscule ou soit en majuscule (barbapapa)

PHP
$texte = str_ireplace($censure, ["*",  "Barpapapa"], $texte);

Donc et si on veut respecter a A barpapapa Barpapapa

On devrait simplifier ce genre de code (en reprenant l'exemple de Nicolas)

PHP
$censure = ["a", "A", "B*rb*r*", "b*rb*r*"];
$texte = str_replace($censure, ["*", "*", "Barpapapa", "barpapapa"], $texte);

On va y arriver ..:rolleyes:
 

Ziggy

Membre
Re,

Quelle aventure mes amis !
Cool le code de Nico avec le tableau ça fait gagner une ligne pour ma déclaration de variables.
str_ireplace excellent ! Oui on s'en tire bien, enfin moi j'avais bien vérifié les a et les A et les b et les B ! 🤥

Si vous êtes d'accord et puisque nous sommes arrivés à nos fins je ferais bien un petit tutoriel sur le sujet dans les ressources, ce weekend j'ai un peu de temps.
A moins que quelqu'un à déjà prévu de s'en charger ?
 

Wazz9

Membre
Il fonctionne parfaitement !! :D
En copiant-collant ton code je me suis retrouvé dans la même impasse, par contre je n'ai pas pu remarquer le problème de majuscules.
Je pensais que le code était mal écrit ou tout simplement que str_replace ne fonctionnait pas avec des mots, ce qui est idiot quand j'y repense.

Donc le résultat de l'exercice est plutôt pas mal, 2 membres ont relevés le défi, yule et Ziggy et d'autres ont ajoutés leur touche perso pour finir sur un code PHP de censure plutôt bien foutu, bravo à tous donc.
 

yule

Membre
Yes c'est une bonne base !

Après tu peux décider de censurer des mots comme vin mais qui ne censure par vinothèque
Utiliser un regex pour enlever des caractères dit polluant .-<>[] dans un texte ...
De remplacer les accents par les mêmes lettres sans accents
De supprimer le dernière caractère vide ou blanc d'une chaîne
etc...

En tout cas c'est cool, à plusieurs on avance et nous avons tous qqchose à apprendre, moi le premier !
Bonne bonne
Yule
 

Cocoribot

not human
📢 L'exercice est terminé, vous pouvez poser vos questions au sujet de la fonction str_replace dans la discussion liée au tutoriel :
 
Dernière modification par un modérateur:

Ces discussions pourraient vous intéresser...

  • Résolue
Salut, J'ai une erreur PHP que je n'arrive pas à résoudre, voici le code simplifié <!DOCTYPE html> <html> <head> <title>Cours PHP & MySQL</title> <meta charset="utf-8"> <link rel="stylesheet" href="style.css"> </head> <body> <h1>Titre</h1>...
  • Résolue
Hello, Quand j'essaie de connecter mon fichier PHP à la base de données sur mon serveur local cela ne fonctionne pas. (site WordPress) ERROR ESTABLISHING A DATABASE CONNECTION Pourtant mes éléments sont bons, j'ai vérifié et revérifié. Je vous colle le code du fichier PHP correspondant à la...
  • Résolue
Yo ! J'ai une div sans bordure remplie de cellules horizontales auxquelles j'applique une bordure sur le bord bas pour les séparer entre elles. Le problème c'est que la dernière je ne veux pas de bordure basse puisqu'il n'y a plus de cellule sous elle. Je n'ai pas la main sur le HTML parce que...
Haut