8791 sujets

Développement web côté serveur, CMS

Je ne suis surtout pas doué pour comprendre ce système.

Voici mon code
<?php
$in = "abg123acb";
$pattern = array( '/a/','/b/');
$replacement = array( 'b', 'c');
$out = preg_replace($pattern , $replacement ,$in) ;

$patternr = array( '/b/','/c/');
$replacementr = array( 'a', 'b');
$reverse = preg_replace($patternr , $replacementr ,$out) ;

echo "in: ".$in."<br />";
echo "out: ".$out."<br />";
echo "reverse: ".$reverse."<br />";
?>

Mon but est de 'coder' le string in en simplement changeant une lettre par une autre.
in: abg123acb je m'attendais à bcg123bcc
out: ccg123ccc que j'obtiens
reverse: bbg123bbb je souhaite retrouver le string de départ.

Tout se passe comme si Regex reprenait son traitement en début de chaine après chaque transposition.
Première itération ( a->b : abg devient bbg
Deuxième itération ( b->c: bbg devient ccg

Est-ce le comportement standard de Regex ou y-a-t-il posibilité de maitriser cela?
Merci d'avance pour vos conseils Smiley eek
Modifié par megaten (25 Nov 2011 - 21:48)
Merci de ta confirmation, c'est bien ce que je craignais d'atant que str-replace à le meme comportement.
Bonne fin de soirée Smiley decu
pour un cas avec juste des lettres comme ce que tu montres

$str = abg123acb;

echo strtr ( $str , array ('a' => 'b', 'b' => 'c') );

donne

bcg123bcc.

mais ça ne marche que si le pattern et le transforme ont exactement le même nombre de caractere
Parfait
Donc pour aller dormir vite et longtemps voici le resultat avec votre support et celui de la doc strtr
<?php
function stro_replace($search, $replace, $subject)
{
return strtr( $subject, array_combine($search, $replace) );
}

$in = "abg123bad22rst@rte";

$search = 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');
$replace = 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');
$out = stro_replace($search, $replace, $in); // output: 'BCDEF'


echo "in: ".$in."<br />";
echo "out: ".$out."<br />";

echo "============================"."<br />";

$replace = 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');
$search = 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');
$reverse = stro_replace($search, $replace, $out); // output: 'BCDEF'

echo "reverse: ".$reverse."<br />";
echo "============================"."<br />";

?>
resultat:
in: abg123bad22rst@rte
out: bch123cbe22stu@suf
============================
reverse: abg123bad22rst@rte
============================
Merci encore Smiley smile Smiley smile