Форум программистов, компьютерный форум, киберфорум
PHP: RegExp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
9 / 10 / 5
Регистрация: 29.09.2016
Сообщений: 81

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

06.06.2017, 08:40. Показов 787. Ответов 4

Студворк — интернет-сервис помощи студентам
Всем доброе утро! У меня есть код для замени текста:

PHP
1
2
3
4
5
6
7
8
$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 равно:

PHP
1
2
3
4
5
6
7
$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.
И так далее... Массиве все слова для поиска и замены будут в нижнем регистре.

У меня есть свой код который заменяет все слова в точном регистре. Но он заменяет не так как нужно, хотя регистр он сохраняет. Вот этот код:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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()" очень скоростная но у него проблемы. Может у кого то есть какие то варианты. Спасибо всем за ранее.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.06.2017, 08:40
Ответы с готовыми решениями:

Как запускать программу так, чтобы ей были доступны необходимые для её корректной работы каталоги с файлами?
Добрый день, есть программа, с каталогами, в которых хранятся необходимые для корректной работы файлы. При попытке запустить программу из...

Настройка и запуск VirtualBox для корректной работы ?
Здравствуйте. Хотел установить ос windows 8.1 iso файл. Прежде хочу попробовать её на VirtualBox. Во время настройки машины...

Есть ли какие то обновления для Windows 7 x86 для корректной работы Free Pascal
Есть ли какае то обновления для Win7 x86 для корректной работы Free Pascal на ней?

4
1137 / 685 / 412
Регистрация: 07.11.2015
Сообщений: 1,102
07.06.2017, 00:35
Вместо /\pL+/u там нужно собирать шаблон примерно так:
PHP
1
2
3
4
5
6
7
8
9
10
$dict = array(
        "raptor editor" => "tinymce editor",
        "editor" => "false",
        "javascript wysiwyg html editor" => "jquery wysiwyg html editor",
        "wysiwyg" => "false",
        "html" => "false"
);
 
$pattern = array_map(function ($x){ return preg_quote($x, '/'); }, array_keys($dict));
$pattern = '/' . implode('|', $pattern) . '/iu';
Если там очень большой словарь и так важна скорость работы, то стоит смотреть в сторону алгоритмов Комменца-Вальтера или Ахо-Корасик. Вроде были расширения для php, которые реализуют эти алгоритмы.
0
9 / 10 / 5
Регистрация: 29.09.2016
Сообщений: 81
07.06.2017, 09:45  [ТС]
Хорошо Emilien, сначала хочу сказать спасибо за ответь, но после этого шаблона появился одна ошибка. Я использовал эту строку
PHP
1
$string = "RaPTor EDitOr является редактором с открытым исходным кодом JAVAscript wYsIwYg HTML editor.";
Функция стала вот таким:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
function repl($string, $dict)
{
   $pattern = array_map(function ($x){ return preg_quote($x, '/'); }, array_keys($dict));
   $pattern = '/' . implode('|', $pattern) . '/iu';
   $string = preg_replace_callback($pattern, 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"
    );
 
   $repl = repl($string, $dict);
    echo "<p>".$repl."</p>";
В ответе одна буква "r" в конце первого слова "EDitOr" удаляется. Т.е ответ был таким:
TiNYmce EdiTo является редактором с открытым исходным кодом JQUEry wysiwYg hTml EDItor.
А ответь должно была бы
TiNYmce EdiTor является редактором с открытым исходным кодом JQUEry wysiwYg hTml EDItor.

Вообще то слово написано вот так - EDitOr
А в ответе должна была бы именно так - EDitOr
А функция возвращает - EdiTo + в конце буква "r" нету.
0
1137 / 685 / 412
Регистрация: 07.11.2015
Сообщений: 1,102
07.06.2017, 13:06
Проблема не в шаблоне.
Обрезает буквы т.к. в callback-функции не учитывается случай, когда одна строка короче другой.
Code
1
2
"raptor editor"
"tinymce editor"
Там в результате и с фразой wysiwyg html тоже всё наперекосяк:
Code
1
2
JAVAscript wYsIwYg HTML editor
JQUEry wysiwYg hTml EDItor
0
9 / 10 / 5
Регистрация: 29.09.2016
Сообщений: 81
07.06.2017, 15:14  [ТС]
Значит если заменяемая строка равно со значением массива тогда будет точная замена так? Например строка:
$string = "Hello World!";
$dict = array("hello" => apple);

Вот здесь строка которое ищется равно с строкой замены "apple". Оба по 5 символов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.06.2017, 15:14
Помогаю со студенческими работами здесь

Запрет фокусировки на кнопке для корректной работы KeyDown
Здравствуйте! Возник вопрос: у меня игрушка, реагирует на нажатие стрелок, решил добавить кнопку &quot;выход&quot;, проблема в том, что...

Описать рекурсивную функцию Palindrome(S) логического типа: переделать программу для работы с файлами
Доброго дня суток! помогите пожалуйста переделать программу, чтобы она работала с файлом. Не могу понять как переделать функцию для работы...

Где нужно всунуть Критическую секцию для корректной работы
Здравствуйте, есть такая проблема, точнее я полагаю, что она там есть. В обще при создании форм я достаю информацию из ИНИ файла. И иногда...

Ищу драйвера под видеокарту Intel HD Graphics для корректной работы OpenGL
Решили с другом по деградировать немного в майнкрафте. Раньше пару раз играл и всё было нормально. Теперь вылезает ошибка с...

Определить, какое количество видеопамяти необходимо для корректной работы сотового телефона
Сотовый телефон (коммуникатор) имеет следующие параметры экрана: ширина дисплея 128 высота дисплея 480 количество отображаемых цветов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru