Задать вопрос
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()" очень скоростная но у него проблемы. Может у кого то есть какие то варианты. Спасибо всем за ранее.
  • Вопрос задан
  • 145 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
glebovgin
@glebovgin
Full Stack Web Developer
Окей, вот вам case insensitive версия strtr
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы