Otabek_96
@Otabek_96
Программист

Как переделать функцию для корректной работы?

Всем добрый день! У меня есть следующий код для замены текста:
$string = "raptor editor является редактором с открытым исходным кодом javascript wysiwyg html editor.";
 
$search = array("raptor editor","editor","javascript wysiwyg html editor","wysiwyg","html");
$replace = array("tinymce editor","false","jquery wysiwyg html editor","false","false");
 
$str = strtr($string,array_combine($search, $replace));
 
echo $str;

Ответ: tinymce editor является редактором с открытым исходным кодом jquery wysiwyg html editor.

Нужно сделать так чтобы этот код заменял текст в правильный вариант в любом регистре. Например если переменная $string равно:
$string = "RAPTOR editor является редактором с открытым исходным кодом javascript wysiwyg html editor.";
$search = array("raptor editor","editor","javascript wysiwyg html editor","wysiwyg","html");
$replace = array("tinymce editor","false","jquery wysiwyg html editor","false","false");
 
$str = strtr($string,array_combine($search, $replace));
 
echo $str;

Ответ: RAPTOR false является редактором с открытым исходным кодом jquery wysiwyg html editor
Ответ должно быть: TINYMCE editor является редактором с открытым исходным кодом jquery wysiwyg html editor.

И так далее... Массиве все слова для поиска и замены будут в нижнем регистре.

У меня есть свой код который заменяет все слова в точном регистре. Но он заменяет не так как нужно, хотя регистр он сохраняет. Вот этот код:
function repl($string, $dict)
{
   $string = 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]; 
    }, $string);
 
   return $string;
}
 
$dict = array
 (
        "raptor editor" => "tinymce editor",
        "editor" => "false",
        "javascript wysiwyg html editor" => "jquery wysiwyg html editor",
        "wysiwyg" => "false",
        "html" => "false"
);
 
$string_1 = "Raptor Editor является редактором с открытым исходным кодом JavaScript WYSIWYG HTML editor.";
$string_2 = "raptor editor является редактором с открытым исходным кодом javascript wysiwyg html editor.";
$string_3 = "RaPTor EDitOr является редактором с открытым исходным кодом JAVAscript wYsIwYg HTML editor.";
 
// Тестирование скрипта:
 
echo repl($string_1, $dict); 
// Raptor False является редактором с открытым исходным кодом JavaScript FALSE FALSE false.
 
echo repl($string_2, $dict); 
// raptor false является редактором с открытым исходным кодом javascript false false false.
 
echo repl($string_3, $dict); 
// RaPTor FAlsE является редактором с открытым исходным кодом JAVAscript fAlSe FALSE false.

В этом скрипте попадает false, поэтому нужно или сделать так, чтобы была правильная замена без false или переделать первого скрипта регистронезависимый. И главное я работаю с миллионами данных в массиве а здесь важно скорость работы скрипта. Второй скрипт "repl()" очень скоростная но у него проблемы. Может у кого то есть какие то варианты. Спасибо всем за ранее.
  • Вопрос задан
  • 144 просмотра
Пригласить эксперта
Ответы на вопрос 1
glebovgin
@glebovgin
Full Stack Web Developer
Окей, вот вам case insensitive версия strtr
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Ведисофт Екатеринбург
от 25 000 ₽
YCLIENTS Москва
от 200 000 до 350 000 ₽
от 300 000 до 500 000 ₽
06 мая 2024, в 10:17
15000 руб./за проект
06 мая 2024, в 10:02
3000 руб./за проект