PHP : str_replace ne marche même pas

PHP : str_replace ne marche même pas - PHP - Programmation

Marsh Posté le 17-09-2009 à 02:57:37    

Bonjour,
 
je m'arrahce les cheveux pour programmer une petite fonction de cryptage ultra simple qui consiste à remplacer la lettre a par b, b par c, etc.
 
Après avoir lu 50 000 fois la doc php sur la fonction str_replace j'en suis toujours là.
 
Si je tape n'importe quoi "diobzey" en mode "crypter" il me retroune "aaaaaa";
si je passe en mode décrypter il me retroune un truc à peu près correct, sauf pour la lettre b à laquelle il retourne "z" au lieu de "a" (manquait plus que ça, le serveur n'est pas logique !).
 
Je suis sur PHP 4.4 et d'après la doc il n'y a pas de bug sur cette version.
 
Voici le code :
(n'hésitez pas à faire executer le code sur une de vos machines si le code vous semble trop compliqué ^^)
 

Spoiler :

<?php  
 
$initial=array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
$final = array('b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'a');
 
if(isset($_POST['start']) && isset($_POST['saisie']))  
 
{  
if ($_POST['choix']=='crypt')  
 { echo str_replace($initial, $final, $_POST['saisie']); }
elseif ($_POST['choix']=='decrypt')  
 { echo str_replace($final, $initial, $_POST['saisie']); }
else
 { }
}
 
else
 
{ ?>
 
<form method="post" action="crypter.php">
 
<p>
<textarea name="saisie" cols="100" rows="15"></textarea>
</P>  
 
<P>
<input type="radio" name="choix" value="crypt" checked> CRYPTER
<input type="radio" name="choix" value="decrypt"> DECRYPTER
</p>
 
<P>
<input type="submit" value="Valider" name="start">
</p>
</form>
 
<?  
 
}
 
?>


Message édité par prussian_blue1889 le 17-09-2009 à 03:09:48
Reply

Marsh Posté le 17-09-2009 à 02:57:37   

Reply

Marsh Posté le 17-09-2009 à 03:31:25    

Poum poum poum,
ta solution:
 
http://fr2.php.net/manual/fr/function.strtr.php

Reply

Marsh Posté le 17-09-2009 à 09:33:37    

en même temps, il ne fait qu'un décalage de 1 sur la droite dans le code ascii  :/ C'est complètement nul comme "cryptage" (-> chiffrement).


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 17-09-2009 à 10:20:57    

étant donné mes besoins je n'ai pas besoin de "cryptage" plus compliqué , juste un décalage d'un ou deux rangs.
 
Visiblement j'ai vu que certains étaient dans le même cas que moi et ca rend fou qu'une fonction aussi simple ne puisse pas donner ce qu'on veut.
 
Sinon strtr ne marche pas non plus, et avec 3 arguments ne demande pas de tableaux.
 
pstr_replace est vraiment nul ! :fou: je vais finir par devenir fou


Message édité par prussian_blue1889 le 17-09-2009 à 10:37:59
Reply

Marsh Posté le 17-09-2009 à 10:48:41    

str_replace te fais un remplacement dans l'ordre des éléments du tableau :
 
si la lettre x devient -> y
elle passe après dans y-> z
et finalement z-> a
du coup t'as 'a' partout.
(cf. http://www.php.net/manual/fr/funct [...] .php#91536 )
 
'working as intended'
 
edit:
-> une implémentation vue sur le net
http://www.phpcs.com/codes/CHIFFRE-CESAR_41756.aspx
(que je n'ai pas testée :o)


Message édité par PunkRod le 17-09-2009 à 10:51:37
Reply

Marsh Posté le 17-09-2009 à 11:02:19    

Merci beaucoup pour ton aide, je ferai un code assez fastidieux mais simple avec strtr() vu que je n'ai pas trop le temps, mais le lien que t'as mis m'a bien aidé.
 
Et pourtant il n'a été écrit nulle part dans les docs php que si le tableau de départ et celui d'arrivée avaient des valeurs en commun, str_replace() remplacerait n'importe comment (dans mon cas ca retombe sur des "aaaaaaa" ).
 
De quoi faire perdre un temps fou à un codeur.

Message cité 1 fois
Message édité par prussian_blue1889 le 17-09-2009 à 11:05:29
Reply

Marsh Posté le 17-09-2009 à 13:14:12    

prussian_blue1889 a écrit :

Merci beaucoup pour ton aide, je ferai un code assez fastidieux mais simple avec strtr() vu que je n'ai pas trop le temps, mais le lien que t'as mis m'a bien aidé.
 
Et pourtant il n'a été écrit nulle part dans les docs php que si le tableau de départ et celui d'arrivée avaient des valeurs en commun, str_replace() remplacerait n'importe comment (dans mon cas ca retombe sur des "aaaaaaa" ).
 
De quoi faire perdre un temps fou à un codeur.


 [:sh@rdar]  :

Citation :

Si search  ou replace  sont des tableaux, les éléments sont traités du premier, au dernier.


str_replace ne remplace pas "n'importe comment", il agit comme prévu :
Tu donnes un tableau de recherche et un tableau de remplacement => il prend les éléments du tableau de recherche un par un, et il les remplace par le remplacement.
Sur une chaîne "ab", il prend le premier élément de $initial ('a'), il le trouve => il le remplace par le premier élément de $final ('b'). Résultat = 'bb'.
Il prend ensuite le deuxième élément de $initial ('b') et le remplace par 'c' => 'cc'.
etc.
A la fin, il remplace les 'z' par des 'a' => tu as bien 'aa'.
 
Tu peux faire ton code simplement (sans que ce soit fastidieux) avec strtr(), mais il faut faire attention aux caractères spéciaux !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed