Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Поиск и замена слов по списку (https://javascript.ru/forum/misc/50991-poisk-i-zamena-slov-po-spisku.html)

EvgenStor 20.10.2014 13:09

Поиск и замена слов по списку
 
Приветствую!

Помогите пожалуйста написать скрипт поиска и замены слов по списку.

Есть текст на странице к примеру:
  • Milk
  • cold juice
  • bananas
  • Milky Way
Есть list.txt со списком слов замены на сервере
===============
milk|Молоко
cold juice|Сок холодный
bananas|Бананы
Milky Way|Милки вэй
===============
Задача в том, что бы слова на странице сайта заменялись по правилам из списка list.txt который будет пополнятся. Переводимое слово или выражение должно совпадать полностью (но не учитывая регистр букв). Поиск совпадений должен производится с верху вниз по списку.

В итоге после загрузки страницы будет:
  • Молоко
  • Сок холодный
  • Бананы
  • Милки вэй

Со скриптами знаком поверхностно, одному такую задачу не решить. Помогите пожалуйста.

tsigel 20.10.2014 13:21

EvgenStor,
Эту задачу стоит решать на сервере. По крайней мере такую реализацию. Javascript тут не при чем.

EvgenStor 21.10.2014 00:53

tsigel,
Спасибо за ответ! Не думал, что скриптом не получится. А через PHP тоже не получится?

ruslan_mart 21.10.2014 12:23

http://learn.javascript.ru/play/hoaYSb

tsigel 21.10.2014 16:08

EvgenStor,
Я не говорил что не получится. эту задачу можно решить на js, но это будет не правильно. Правильнее делать это на сервере.

Vlasenko Fedor 21.10.2014 20:32

Ruslan_xDD
можешь пояснить почему ты передаешь null $.get('list.txt', null, function(data) {
почему не пишешь $.get('list.txt', function(data) {

EvgenStor 22.10.2014 01:41

Цитата:

Сообщение от Ruslan_xDD (Сообщение 336737)

Супер!!! Работает :thanks: !!! Но только вот почему то текст в тегах не меняет.
http://learn.javascript.ru/play/TqOAJ
Можно как то подправить?

Цитата:

Сообщение от tsigel (Сообщение 336792)
EvgenStor,
Я не говорил что не получится. эту задачу можно решить на js, но это будет не правильно. Правильнее делать это на сервере.

Сейчас я это делаю с помощью программы у себя на ПК, после чего результат загружаю в сеть, но честно говоря это утомительно, занимает очень много времени. Поэтому и решил автоматизировать этот процесс. Делать это на сервере может и правильно, но как это можно решить понятия не имею.

рони 22.10.2014 02:20

EvgenStor,
http://learn.javascript.ru/play/SjNRic

ruslan_mart 22.10.2014 05:09

Poznakomlus, да я jQuery особо не пользуюсь, так что не знал, что так можно писать. :)

EvgenStor 22.10.2014 13:37

рони, Ruslan_xDD,
Благодарю за помощь! Вариант от рони меняет текст в тегах. Но есть одна проблема, когда я ввожу постепенно список поиска-замены все работает. Но как только я копирую полный список поиска-замены все перестает работать. Почему так происходит? Может какие то символы, цифры, пробелы, количество слов тормозят обработку? Посмотрите пожалуйста рабочий вариант, скажите что не так? :-?
http://learn.javascript.ru/play/3DoSMb

ruslan_mart 22.10.2014 13:51

Так?

http://learn.javascript.ru/play/cScGr

рони 22.10.2014 14:46

:write:
на всякий случай ... лучше конечно менять содержимое текстовых нод чтоб шкурку не попортить. :)

kostyanet 22.10.2014 15:17

Вот именно, то есть траверзить дерево и ковырять эти ноды. Ну там если бы перевод - понятно, а тут замена.

ТС, текст на странице откуда берется - там и заменяйте все.

EvgenStor 22.10.2014 15:45

Цитата:

Сообщение от Ruslan_xDD (Сообщение 336912)

Супер! Все работает! Причем довольно шустро, не ожидал!

Цитата:

Сообщение от рони (Сообщение 336918)
:write:
на всякий случай ... лучше конечно менять содержимое текстовых нод чтоб шкурку не попортить. :)

Ты прав, верстка слетает! А как сделать что бы скрипт применялся только для <div class="info"></div>
http://learn.javascript.ru/play/AyDk2b

kostyanet 22.10.2014 15:53

DBSM детектед.

kostyanet 22.10.2014 16:03

Щас я вам покажу как это делается

UPDATE table SET column=REPLACE(column, from_str, to_str);

Теперь самая мякотка: в екзеле делаете лист и разбиваете запрос на колонки

UPDATE table SET column=REPLACE(column | from_str| to_str

шланги изображают колонки

Затем добавляете пустую колонку в А и там рисуете формулу СЦЕПИТЬ и сцепляете попутно добавляя в нее запятые и финальную скобку с двоеточкой.

Копируете формулу и заполняете ей весь столбец. У вас получится список запросов на все замены. Копируете этот столбец, идете на хостинг, открываете phpMyAdmin или что у вас там (полагаю консоль вы не осилите) и выбрав пункт SQL вставляете и жмете GO.

Готово, на всю жизнь сразу.

ruslan_mart 22.10.2014 16:49

Цитата:

Сообщение от EvgenStor
Ты прав, верстка слетает! А как сделать что бы скрипт применялся только для <div class="info"></div>

http://learn.javascript.ru/play/9YbtXb

EvgenStor 22.10.2014 16:54

kostyanet,
К сожалению ваш способ мне не подойдет

Помогите привязать скрипт к конкретному class
Попробовал сделать так http://learn.javascript.ru/play/48AaY
но после обработки скриптом остается только тот участок кода который обрабатывается, а все остальное пропадает. :blink:

ruslan_mart 22.10.2014 16:59

EvgenStor, смотрите сообщение выше. :)

EvgenStor 22.10.2014 17:06

Ruslan_xDD,
Спасибо огромное! Теперь все тип-топ, классный скриптик получился :victory:

Ruslan_xDD, рони, с меня на пиво Яндекс кошелек есть? :yes:

kostyanet 22.10.2014 17:36

Цитата:

Сообщение от EvgenStor
К сожалению ваш способ мне не подойдет

Кто знает как такое вообще получается? Ну то есть скрипт же не для GM'ы какой-нибудь, он же с сервера валится с хтмлем, а хтмл тогда откуда?

Я уже несколько раз пытался раскрыть эту тайну - бесполезно. Как будто действительно данные берутся из мозга жанны агузаровой, а веб-дизайнерам ничего не остается как принимать и обрабатывать.

kostyanet 22.10.2014 17:39

Кстати, а роботы берут текст как файл, или ждут пока скрипт прочихуйется и тогда уже ковыряют текстовые ноды?

idav 19.06.2015 18:24

Ruslan_xDD, Спасибо за отличный скрипт! Подскажите, что нужно доработать, чтобы в заменяемое поле (в файле до черты) можно было вставить пары слов и они заменялись?

EvgenStor 02.07.2015 11:37

Подправьте пожалуйста яваскрипт, почему то скрипт со вчерашнего дня стал удалять открывающую скобу тега "<" , и весь текст получается вперемешку с кодом. http://plnkr.co/edit/ZvFbZDy4N5RTDo5DJ47S?p=preview

рони 02.07.2015 13:49

EvgenStor,
конец файла list.txt -- уберите последнюю строку --замены
Цитата:

<|

EvgenStor 02.07.2015 17:11

Во я лопухнулся, :lol: , бывает! Я почему то и не догадался на список замен обратить внимание, хотя как раз его менял на кануне.
рони спасибо выручил :thanks: :victory: !

EvgenStor 15.06.2017 14:41

Помогите подправить код, что бы он работал с несколькими блоками на странице. Сейчас он обрабатывает только один блок, а остальные игнорирует.

http://plnkr.co/edit/AHBJewTNJq4h8RuQJgdA?p=preview

рони 15.06.2017 14:52

EvgenStor,
http://plnkr.co/edit/1aBa86mtIYOKsk0H7B5k?p=preview

EvgenStor 15.06.2017 16:50

Спасибо рони, в очередной раз выручаешь! А можно как то сделать, что бы подгружаемые блоки после нажатия на кнопку "показать еще", тоже обрабатывались скриптом? К коду самой кнопки доступа нет.
http://plnkr.co/edit/mnJisSqbmks1J6lBRaS8?p=preview

рони 15.06.2017 17:07

EvgenStor,
сделать можно, но помочь не могу, нужен другой специалист.

EvgenStor 15.06.2017 20:44

Рони,
А если запускать скрипт по нажатии на кнопку "показать еще", с задержкой секунды на три, будет работать?

рони 15.06.2017 21:27

Цитата:

Сообщение от EvgenStor
с задержкой секунды на три

зависит от скорости ответа сервера на эту кнопку и лучше в api кнопки.

рони 15.06.2017 21:37

EvgenStor, ниже это не код!!! а ...
$(function() {
    $.get("list.txt", function(data) {
        function fn() {
            [].forEach.call(document.querySelectorAll(".info"), function(elem) {
                var content = elem.innerHTML;
                data.replace(/^(.*?)\|(.*?)$/gm, function(a, b, c) {
                    content = content.replace(new RegExp("(^|\\s|\\b)(" + b.replace(/[\\\/()*+.?|]/g, "\\$1") + ")(\\.|\\s|\\b|&|$)", "igm"), "$1" + c + "$3")
                });
                elem.innerHTML = content
            })
        }
        fn();
        $("#page-more").on("click", "button", function() {
            window.setTimeout(fn, 3000)
        })
    })
});

EvgenStor 24.09.2017 21:50

Доброе время суток,
Подправьте пожалуйста регулярку в скрипте. Дело в том, что скрипт меняет текст не только между тегами но и в самих тегах, в следствии чего ссылки становятся нерабочими. Т.е. если в ссылке href="" попадается слово подходящее под замену оно меняется, но адреса такого естественно нет.
Исходная ссылка:
<a href="/search/Serie%3A%20Acer%20Jade/" rel="nofollow" class="eTag">Серия: Acer Jade</a>
Обработанная скриптом:
<a href="/search/Серия%3A%20Acer%20Jade/" rel="nofollow" class="eTag">Серия: Acer Jade</a>

Если возможно сделайте так, что бы скрипт обрабатывал только внутри любых тегов, т.е изменял содержимое между <любой тег>Текст для замены</любой тег>

http://plnkr.co/edit/5S7Mv9YVP5NcciACfPbO?p=preview

рони 24.09.2017 22:14

EvgenStor,
http://plnkr.co/edit/U5pEBOR8wrWQa8D2H36K?p=preview

$(function() {
      $.get('list.txt', function(data) {
        [].forEach.call(document.querySelectorAll('.info'), function(elem) {
          var treeWalker = document.createTreeWalker(elem, NodeFilter.SHOW_TEXT, null, false);
          while (treeWalker.nextNode()) {
          var el = treeWalker.currentNode;
          data.replace(/^(.*?)\|(.*?)$/gm, function(a, b, c) {
          el.data = el.data.replace(new RegExp('(^|\\s|\\b)(' + b.replace(/[\\\/()*+.?|]/g, '\\$1') + ')(\\.|\\s|\\b|&|$)', 'igm'), '$1' + c + '$3');
          });
         }
        });
      });
    });

EvgenStor 25.09.2017 10:59

Спасибо рони, работает! Только скорость обработки стала почему то на много медленней, если раньше процесс занимал примерно 3 сек. после появления содержимого сайта, то теперь доходит до 17 сек. Почему так?

рони 25.09.2017 11:22

EvgenStor,
потому что меняет страницу на много раз больше

EvgenStor 25.09.2017 11:44

Рони, можно с этим что то сделать, что бы сократить время обработки? Отблагодарю денежным вознаграждением за твою помощь. А то придется возвратится к старому варианту, без ссылок, поскольку такая задержка сильно замедляет просмотр страниц. Я не думал, что исключение тегов из поиска замены так сильно скажется на производительности, скорее наоборот предполагал, если скрипт исключит лишнее будет работать быстрее.

рони 25.09.2017 13:06

EvgenStor,
заменить на это и
в строке 9 как можно точнее укажите где находится текст для перевода
$(function() {
    $.get("list.txt", function(data) {
        data = data.match(/^(.*?)\|(.*?)$/gm).map(function(b) {
            b = b.split("|");
            b[0] = new RegExp('(^|\\s|\\b)(' + b[0].replace(/[\\\/()*+.?|]/g, '\\$1') + ')(\\.|\\s|\\b|&|$)', 'igm');
            b[1] = '$1' + b[1] + '$3'
            return b
        });
        [].forEach.call(document.querySelectorAll(".info td, .info a"), function(elem) {
            data.forEach(function(b) {
                elem.textContent = elem.textContent.replace(b[0], b[1])
            })
        })
    })
});

EvgenStor 25.09.2017 13:41

Рони,
Стал работать чуть быстрее 9-10 сек на сайте. В редакторе 5-6 сек. http://plnkr.co/edit/8KZn07P7leNW8YA40BbZ?p=preview
Но стал переводить внутри слов Fuji FinePix > Fuji FвePix, Kompaktkamera > KoмpaktКамера
Сайт у меня на https


Часовой пояс GMT +3, время: 03:17.