Вставка символов юникода в строку

202
28 октября 2017, 17:52

Здравствуйте. Сайт работает в кодировке Windows-1251, в том числе и соединение с базой MySQL. Все файлы сохранены в Windows-1251.

Появилась необходимость сделать замену слов в строке, с помощью str_replace.

Замена обычных символов, типа

str_replace("Слово", "Замена", $str);

работает хорошо.

Но возникла проблема при замене слова на слово с символами юникода.

Как только я прописал

str_replace("Слово", "кοᴛοᴘыᴇ", $str);

редактор кода выдал сообщение:

сохранил файл в UTF-8, но замена слова не произошла в строке, осталось прежнее слово Слово .

Что можно сделать?

Answer 1

Я протестировал этот код у себя и это у меня сработало:

$str = "Слово";
echo "<p>$str</p>"; // Слово
$str =  str_replace("Слово", "кοᴛοᴘыᴇ", $str);
echo "<p>$str</p>"; // Результат: которые

Но у меня есть и другой функция для вас чтобы заменить ключ в значение в ассоциативном массиве. Вот пример функции и использование:

Сама функция:

function replaceKeyToValue($request, $dict){
    $response = preg_replace_callback("/\pL+/u", function ($m) use ($dict) {
        $word = mb_strtolower($m[0]);
        if (isset($dict[$word])) {
            $repl = $dict[$word];
            if ($word === $m[0]) return $repl;
            if (mb_strtoupper($word) === $m[0]) return mb_strtoupper($repl);
            if (mb_convert_case($word,  MB_CASE_TITLE) === $m[0]) return mb_convert_case($repl,  MB_CASE_TITLE);
            for ($i = 0, $len = mb_strlen($word); $i < $len; ++$i) {
                $mixed[] = mb_substr($word, $i, 1) === mb_substr($m[0], $i, 1) 
                    ? mb_substr($repl, $i, 1)
                    : mb_strtoupper(mb_substr($repl, $i, 1));
            }
            return implode("", $mixed);
        }
        return $m[0];
    }, $request);
    return $response;
}

Пример массива:

$array = array
(
  'слово' => 'которые'
);

Пример использование:

$str = "слово Слово СЛОВО";
echo replaceKeyToValue($str, $array);

Результат:

которые Которые КОТОРЫЕ

То есть функция выводит ответ в том регистре в каком он и написано в входном тексте. Но не работает если вы например будете использовать разные регистры: "СлОвО слОВО СлоВо" Поэтому рекомендуется использовать или нижний или верхний или начало с верхним а далее с нижним регистром "слово СЛОВО Слово"

READ ALSO
Learn, Share, Build

Learn, Share, Build

I make repository in githubRegister it in packagist

146
Как посчитать количество за день

Как посчитать количество за день

ЗдравствуйтеЕсть скрипт xCharts для реализации графика ссылка на исходники

232
Отправить свою цену в корзину из произвольного поля

Отправить свою цену в корзину из произвольного поля

Вопрос заключается в следующемНастряпал код который перемножает цену товара на определенный курс, по заданному признаку и записывает новую...

196