[RESOLU] str_replace ne fonctionne pas sur variable formulaire avec les caractères ’ et ‘

Petit nouveau ! | 6 Messages

30 déc. 2021, 16:34

Bonjour,

’ et ‘

Ce code

$remplace_caracteres_1 = array('’', '‘');
$remplace_caracteres_2 = array('\'', '`');

fonctionne si la variable est déclarée dans le code de cette façon :

$texte = '’--‘';
/* ici c'est en 1er caractère une apostrophe typographique comme celle de LibreOffice avec la touche 4 alphabétique, soit ’
puis après les 2 tirets du 6, l'accent grave (utilisé pour les requêtes sql, soit ` */
$texte = str_replace($remplace_caracteres_1, $remplace_caracteres_2, $texte);
echo 'texte = '.$texte;

le résultat revoie bien dans le code source :
texte = '--`

mais il ne fonctionne pas si la variable vient d'un formulaire
<form name="xxxxxxxxxxxx" action="xxxxxxxxxxxxx.php" method="post">
passée au extract($_POST,EXTR_OVERWRITE);
le contenu de la variable reste intacte après str_replace

c'est donc avec seulement ces 2 caractères, car testé avec les lettres il fonctionne, et j'ai testé séparément aussi idem.

Pourquoi je veux faire ça ? parce qu'il m'était arrivé qu'une table soit illisible du fait qu'il y avait une apostrophe typographique dans des champs texte que j'y avais écrit, à l'époque j'avais dû faire un remplacement avant de tout réinjecter.

Avez-vous une explication du pourquoi str_replace ne fonctionne pas avec ces caractères sur une variable venant d'un method="post" ou une autre solution pur les remplacer ?
Sinon je le ferai manuellement par un rechercher/remplacer dans un bloc texte.

Merci.

Mammouth du PHP | 2703 Messages

30 déc. 2021, 17:40

https://www.php.net/manual/fr/function.ord.php pour voir ce que contient la chaine quand cela fonctionne et quand cela ne fonctionne pas. si le remplacement ne se fait pas, c'est qu'il y a une différence.

Petit nouveau ! | 6 Messages

31 déc. 2021, 00:57

Merci

Test avec
Exemple #2 Examiner les octets individuels d'une chaîne UTF-8
de la page donné par or 1

la page meurt si le code ord() est placé après :
extract($_POST,EXTR_OVERWRITE);
extract($_GET, EXTR_OVERWRITE);
je ne sais pas précisément quel élément du code provoque ça

comme le formulaire est action="" vers la même page il faut des variables de nom différent
résultat du test :

- variable $str déclarée dans la page contenant
Octet 0 de $str a comme valeur 146

- l'apostrophe typographique envoyé par un formulaire method="post"
<textarea name="tete" cols=60 rows=5></textarea>
et récupérée par $_POST["tete"]
Octet 0 de $_POST["tete"] a comme valeur 226
Octet 1 de $_POST["tete"] a comme valeur 128
Octet 2 de $_POST["tete"] a comme valeur 153

-Si je fais la même chose avec $str='a';
c'est le même résultat pour les deux variables
Octet 0 de $str a comme valeur 97
donc la différence se produit seulement avec certains caractères
test avec le caractère ` (sous win Alt Gr + 7 alpha)
Octet 0 de $str a comme valeur 96
identique pour les 2 variables
finalement c'est plutôt celui-là qui est utilisé pour les requêtes sql donc plus un problème

- Peut-être la solution, envoyer l'apostrophe typographique en type="hidden" mais avec sa valeur html &#146; et non pas en dur
Mauvais <input type="hidden" name="apostrophe_typographique_hidden" value="">
Bon <input type="hidden" name="apostrophe_typographique_hidden" value="&#146;">

$_POST["tete"]
Octet 0 de $_POST["tete"] a comme valeur 226
Octet 1 de $_POST["tete"] a comme valeur 128
Octet 2 de $_POST["tete"] a comme valeur 153

$_POST["apostrophe_typographique_hidden"]
Octet 0 de $_POST["apostrophe_typographique" a comme valeur 226
Octet 1 de $_POST["apostrophe_typographique"] a comme valeur 128
Octet 2 de $_POST["apostrophe_typographique"] a comme valeur 153

Je vais continuer les test de remplacement str_replace() et je reviendrai vous dire.

Merci de ton aide précieuse.

Petit nouveau ! | 6 Messages

01 janv. 2022, 00:33

Confirmation :

après
extract($_POST,EXTR_OVERWRITE);

avec un remplacement :

$remplace_caracteres_1 = array($apostrophe_typographique_hidden);
$remplace_caracteres_2 = array('\'');

appliqué sur ma variable $tete

$tete = str_replace($remplace_caracteres_1, $remplace_caracteres_2, $tete);

L'apostrophe typographique est bien remplacée par un simple quote '

Maintant il faudrait savoir si d'autres caractères sont modifiés par un envoi formulaire
<form ../.. method="post">

Merci beaucoup pour cette aide !

Eléphanteau du PHP | 11 Messages

01 janv. 2022, 18:53

Bonjour.

<form action='....' method='post' target='_self' enctype='multipart/form-data'>FORMULAIRE</form>
Je me suis fait avoir il y a peu avec un simple textarea dans le formulaire, ou tout simplement une image transmise au serveur.
Si cela peut t'aider.

Petit nouveau ! | 6 Messages

01 janv. 2022, 21:54

Bonjour.
<form action='....' method='post' target='_self' enctype='multipart/form-data'>FORMULAIRE</form>
Je me suis fait avoir il y a peu avec un simple textarea dans le formulaire, ou tout simplement une image transmise au serveur.
Si cela peut t'aider.
@Aorgerit,

J'ai trouvé une page (impossible de poster des liens ici) qui explique enctype='multipart/form-data
j'ai cru comprendre que c'est par sécurité, mais je n'ai pas compris le reste, ça dépasse mes connaissances.
Cela dit ce n'est plus du PHP mais du HTLM, est-ce judicieux de lancer ce sujet sur phpfrance point com ?
De plus le formulaire dont je parlais est dans une zone privée administrateur sous .htaccess/.htpasswd
mais ça m'intéresserais de savoir pour approfondir mes connaissances.
Je te propose par message privé si tu le veux bien.
Merci.

Petit nouveau ! | 6 Messages

14 janv. 2022, 13:00

Complément et alrtenative pour supprimer les accents

Comme beaucoup de caractères accentués arrivent modifiés d'un

Code : Tout sélectionner

<form name="xxxxxxxxxxxx" action="xxxxxxxxxxxxx.php" method="post">
et qu'un remplacement de ce genre ne fonctionne pas dans ce cas :

Code : Tout sélectionner

$texte = strtr($texte, 'àáâãäåçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ', 'aaaaaaceeeeiiiinooooouuuuyyAAAAAACEEEEIIIINOOOOOUUUUY');
à force de recherche j'ai trouvé une fonction pour supprimer les accent et en général les diacritiques, la page s'appelle Supprimer les accents d’une chaîne avec PHP (je ne peux pas mettre le lien), voici le code miracle :

Code : Tout sélectionner

echo \Transliterator::create('NFD; [:Nonspacing Mark:] Remove; NFC') ->transliterate('Héhé, ça marche !') ; // Hehe, ca marche !
Je l'ai adapté de cette façon :

Code : Tout sélectionner

$texte = Transliterator::create('NFD; [:Nonspacing Mark:] Remove; NFC') ->transliterate($texte);
Ah oui ! j'ai supprimé l'antislash avant Transliterator:: car :

1 - ça fonctionne sans ;
2 - dans mon éditeur php préféré avec colorisation syntaxique, cet antislash n'a pas la couleur de la commande
\Transliterator::create
donc ça m'a mis la puce à l'oreille ;
3 - j'ai trouvé le code sur d'autres pages sans l'antislash dont celle-ci présentée de façon alternative :

Code : Tout sélectionner

$enc = "UTF-8"; // On retire les accents de la chaine et du terme recherché $transliterator = Transliterator::create('NFD; [:Nonspacing Mark:] Remove; NFC;'); $sclean = mb_strtolower($transliterator->transliterate($string), $enc); $search = mb_strtolower($transliterator->transliterate($search), $enc);
Maintenant il y a des caractères comme ð ø qui semblent avoir des diacritiques mais en fait non, et qui resterons identiques après le traitement ci-dessus, donc pour n'avoir dans ma chaîne de caractères que minuscules, chiffres et - (tiret du 6), après avoir remplacé les _ . ' par des - je supprime tous les autres caractères avec cette fonction :

Code : Tout sélectionner

$texte= preg_replace('/([^.a-z0-9-]+)/i', '', $texte);
Par contre l'astuce donnée plus haut pour remplacer l'apostrophe typographique est toujours valable car ce n'est pas un diacritique.

Mammouth du PHP | 2703 Messages

14 janv. 2022, 14:17


Comme beaucoup de caractères accentués arrivent modifiés d'un

Code : Tout sélectionner

<form name="xxxxxxxxxxxx" action="xxxxxxxxxxxxx.php" method="post">
jamais remarqué cela. il faudrait vérifier que l'encodage de la page du formulaire est bien le même que le script qui traite le formulaire. si des données sont copier/coller dans le formulaire, que l'encodage de ces données n'est pas la cause du problème.

Petit nouveau ! | 6 Messages

15 janv. 2022, 23:37

jamais remarqué cela. il faudrait vérifier que l'encodage de la page du formulaire est bien le même que le script qui traite le formulaire. si des données sont copier/coller dans le formulaire, que l'encodage de ces données n'est pas la cause du problème.
Le formulaire est traité dans la même page, et je copie en dur dans le code le même caractère de mon clavier que je tape ensuite dans la boite texte. Là je suis vaincu, ça dépasse mes connaissances, j'avais cru trouvé la solution avec de nouveaux tests mais ça donne des résultats bizarres : les réponses sont différentes selon le caractère, exemple :
- ç est codé 231 en dur dans le code php, 195 167 reçu du formulaire non traité, et 231 du formulaire traité utf8_decode()
- l'apostrophe typographique est codé 97 en dur, 226 128 153 du formulaire non traité, et 63 du formulaire traité utf8_decode()
je mets le code à toutes fins utiles si des personnes veullent bien faire le test chez elles, le fichier doit être nommé test_caracteres_accentues.php, il faut renseigner dans un éditeur ligne 4 la valeur de $caractere_en_dur, puis lancer la page et renseigner le même caractère dans le champ du formulaire :

Code : Tout sélectionner

<?php declare(encoding='UTF-8'); # Ici on renseigne un caractère accentué ou diacritique en dur $caractere_en_dur = "ç"; echo '$caractere_en_dur :'; /*$str = utf8_encode($str);*/ for ( $pos=0; $pos < strlen($caractere_en_dur); $pos ++ ) { $byte = substr($caractere_en_dur, $pos); echo '<br>Octet <b>' . $pos . '</b> de $caractere_en_dur a comme valeur ' . ord($byte) . PHP_EOL; } if (empty($caractere_formulaire)) {$caractere_formulaire='';} ?> <!-- ********************************************************************** --> <!-- ********* Formulaire teste valeur de varialble après post ************* --> <!-- Affichage de la chaine envoyée par le formulaire --> <br><br> <b style="font-size: 50px"><?php echo $_POST["caractere_formulaire"];?></b> <br><br> <b>re&ccedil;ue du formulaire tel quel :</b> <?php /* ******************************************************************* */ /* Affichage du code grâce à declare(encoding='UTF-8') ligne 2 */ $caractere_formulaire=$_POST["caractere_formulaire"]; for ( $pos=0; $pos < strlen($caractere_formulaire); $pos ++ ) { $byte = substr($caractere_formulaire, $pos); echo '<br>Octet <b>' . $pos . '</b> de $caractere_formulaire a comme valeur ' . ord($byte) . PHP_EOL; } ?> <br><br> <b>re&ccedil;ue du formulaire trait&eacute; utf8_decode() :</b> <?php $caractere_formulaire=utf8_decode($caractere_formulaire); for ( $pos=0; $pos < strlen($caractere_formulaire); $pos ++ ) { $byte = substr($caractere_formulaire, $pos); echo '<br>Octet <b>' . $pos . '</b> de $caractere_formulaire a comme valeur ' . ord($byte) . PHP_EOL; } ?> <br><br> <b style="font-size: 22px">Formulaire test caract&egrave;re accentu&eacute; ou diacritique</b> <form action="test_caracteres_accentues.php" method="post"> <textarea name="caractere_formulaire" cols=20 rows=1></textarea> <br> <input type="submit" class="bouton" name="action" value="Tester"> </form>

Mammouth du PHP | 2703 Messages

16 janv. 2022, 00:05

fichier en iso dans mon éditeur de texte :
$caractere_en_dur :
Octet 0 de $caractere_en_dur a comme valeur 231
reçue du formulaire tel quel :
Octet 0 de $caractere_formulaire a comme valeur 195
Octet 1 de $caractere_formulaire a comme valeur 167

fichier en utf8 dans mon éditeur de texte :
$caractere_en_dur :
Octet 0 de $caractere_en_dur a comme valeur 195
Octet 1 de $caractere_en_dur a comme valeur 167
reçue du formulaire tel quel :
Octet 0 de $caractere_formulaire a comme valeur 195
Octet 1 de $caractere_formulaire a comme valeur 167

donc l'encodage choisi dans l'editeur de texte a bien un effet sur le résultat.