-->

How to replace a letter in a string with a new let

2020-02-07 05:13发布

问题:

Lets say I have some code:

$text = $_POST['secret'];

$replaces = array(
        'a' => 's',
        'b' => 'n',
        'c' => 'v',
        'd' => 'f',
        'e' => 'r',
        'f' => 'g',
        'g' => 'h',
        'h' => 'j',
        'i' => 'o',
        'j' => 'k',
        'k' => 'l',
        'l' => 'a',
        'm' => 'z',
        'n' => 'm',
        'o' => 'p',
        'p' => 'q',
        'q' => 'w',
        'r' => 't',
        's' => 'd',
        't' => 'y',
        'u' => 'i',
        'v' => 'b',
        'w' => 'e',
        'x' => 'c',
        'y' => 'u',
        'z' => 'x',

                    );
    $text = str_replace(array_keys($replaces),array_values($replaces),$text);

echo "You're deciphered message is: ".$text;
}

?>

<form action="" method="post">
<p>Enter the secret message: <input name="secret" type="text"/></p>
<input class="button" type="submit" name="submit" value="Submit"/>

</form

Here, a user inputs a secret message, and then the characters are replaced by new characters. For every letter on a keyboard it is replaced with the letter to the right.

eg. if a user enters "gwkki" the output will be "hello". However the above code outputs aeaae and NOT hello. It outputs "aeaae". This is because the letter h changes to j, then j changes to k, then k changes l, then l changes to a. and so on with the other letters. Is there any way for the text to be scanned and changed once??

回答1:

In the PHP Manual it's clearly explained your problem, at the end of the page they advice to use strtr() which does exactly what you want.

Replace

  $text = str_replace(array_keys($replaces),array_values($replaces),$text);

with

  $text = strtr($text,$replaces);

which does exactly what you want, it replaces one character with another character.

The documentation of strtr() is here: http://www.php.net/manual/en/function.strtr.php



回答2:

<?php
$text = $_POST['secret'];

$replaces = array(
    'a' => 's',
    'b' => 'n',
    'c' => 'v',
    'd' => 'f',
    'e' => 'r',
    'f' => 'g',
    'g' => 'h',
    'h' => 'j',
    'i' => 'o',
    'j' => 'k',
    'k' => 'l',
    'l' => 'a',
    'm' => 'z',
    'n' => 'm',
    'o' => 'p',
    'p' => 'q',
    'q' => 'w',
    'r' => 't',
    's' => 'd',
    't' => 'y',
    'u' => 'i',
    'v' => 'b',
    'w' => 'e',
    'x' => 'c',
    'y' => 'u',
    'z' => 'x',
);

for( $i=0,$l=strlen($text);$i<$l;$i++ ){
    if( isset($replaces[$text[$i]]) ){
        $text[$i] = $replaces[$text[$i]];
    }
}

echo "You're deciphered message is: ".$text;

?>

<form action="" method="post">
<p>Enter the secret message: <input name="secret" type="text"/></p>
<input class="button" type="submit" name="submit" value="Submit"/>

</form>


回答3:

this will be your solution

   $text1 = '';
   for($i=0; $i<strlen($text); $i++)  {
     $text1 .= $replaces[$text[$i]];
   }

   echo $text1;

or else you can use like this

$text = strtr($text,$replaces);