Как заменить русскую букву по позиции?

172
23 июня 2018, 01:30

Пытаюсь рандомно заменять русские буквы на английские:

$trans = array(
    'и' => 'U',
    'р' => 'P',
    'е' => 'E',
);
$str = 'Привет';
$res = replace($str, $trans);
echo $res;
function replace($str, $trans)
{
  for ($i = 0; $i < mb_strwidth($str); $i++) {
    if (rand(0,1) and isset($trans[$str[$i]])) $str[$i] = $trans[$str[$i]];
  }
  return $str;
}

Но вот только замена не срабатывает, я как понял из за того что буквы русские, и позицию неверно считывает скрипт. Как можно подобное сделать с русскими буквами чтобы при этом слово не ломалось?

Answer 1

не срабатывает, я как понял из за того что буквы русские

Да, так и есть. Для кириллицы нужно использовать нечто вроде preg_split(). Эта функция корректно разбивает исходную строку на массив символов (в вашем случае - букв), и далее нужно обрабатывать этот массив (а не исходную строку, как было в вашем коде):

$trans = array(
    'и' => 'U',
    'р' => 'P',
    'е' => 'E',
);
$str = 'Привет';
$res = replace($str, $trans);
echo $res;

function replace($str, $trans) {
    $tmp = preg_split('~~u', $str, null, PREG_SPLIT_NO_EMPTY);
    for ($i = 0; $i < mb_strwidth($str); $i++) {
        if (rand(0, 1) & isset($trans[$tmp[$i]])) {
            $tmp[$i] = $trans[$tmp[$i]];
        }
    }
    return join($tmp);
}
READ ALSO
PHP: хранить данные в Cookie или в базе данных?

PHP: хранить данные в Cookie или в базе данных?

Подскажите, пожалуйста, как организовать хранение настроек пользователей: в cookie или в базе данных? Например, пользователь на сайте выбрал,...

173
OpenCart, не меняется статус модуля

OpenCart, не меняется статус модуля

Устанавливаю вот такой вот модуль https://opencartforumcom/files/file/1011-dostavka-po-oblastyam-na-karte/ , но по какой-то причине не меняется его статус и он не хочет работать

264
Работа с массивом $_SESSION

Работа с массивом $_SESSION

Можно ли использовать инструкцию echo внутри массива $_SESSION? Нужно, чтобы каждый элемент массива имел уникальное имя

203