Как заменить букву в строке новой буквой, которая не будет обновляться - PullRequest
2 голосов
/ 22 декабря 2011

Допустим, у меня есть некоторый код:

$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

Здесь пользователь вводит секретное сообщение, а затем символы заменяются новыми.Для каждой буквы на клавиатуре она заменяется буквой справа.

например.если пользователь вводит "gwkki", вывод будет "привет".Однако приведенный выше код выводит aeaae и НЕ привет.Это выводит "aeaae".Это связано с тем, что буква h меняется на j, затем j меняется на k, затем k меняет l, затем l меняется на a.и так далее с другими буквами.Есть ли способ, чтобы текст был отсканирован и изменен один раз?

Ответы [ 3 ]

8 голосов
/ 22 декабря 2011

В руководстве по PHP четко объясняется ваша проблема, в конце страницы они советуют использовать strtr (), которая делает именно то, что вы хотите.

Заменить

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

с

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

, который делает именно то, что вы хотите, он заменяет один символ другой символ.

Документация по strtr () находится здесь: http://www.php.net/manual/en/function.strtr.php

2 голосов
/ 22 декабря 2011
<?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>
1 голос
/ 22 декабря 2011

это будет ваше решение

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

   echo $text1;

, иначе вы можете использовать вот так

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