Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Сравнение двух текстов (https://javascript.ru/forum/misc/40968-sravnenie-dvukh-tekstov.html)

tsigel 27.08.2013 15:19

var text1 = "Мама мыла очень кривую раму";
var text2 = "Мама долго мыла кривую раму";
        var arr1 = text1.split(' ');
        var arr2 = text2.split(' ');

        var result1 = [], result2 = [];

        for (var i = 0; i < arr1.length; i++) {

            if (arr2[i] == undefined) {

                for (var j = i; j < arr1.length; j++) {
                    arr1[j] = "<span class='changedText'>" + arr1[j] + "</span>";
                }
                break;

            }

            if (arr1[i] != arr2[i]) {

                if (findInArray(arr1[i], arr2)) {

                    arr1.splice(i, 0, arr1[i]);
                    arr2[i] = "<span class='changedText'>" + arr2[i] + "</span>";

                    if (result1[result1.length - 1] != arr1[i])
                        result1.push(arr1[i]);

                    result2.push(arr2[i]);
                } else {

                    arr2.splice(i, 0, arr2[i]);
                    arr1[i] = "<span class='changedText'>" + arr1[i] + "</span>";
                    result1.push(arr1[i]);
                }

            } else {
                if (result1[result1.length - 1] != arr1[i])
                    result1.push(arr1[i]);
                result2.push(arr2[i]);
            }
        }

        function findInArray (element, array) {
            var find = false;

            for (var i = 0; i < array.length; i++) {
                if (array[i] == element)
                    find = true;
            }

            return find;
        }

alert(result1.join(' '));
alert(result2.join(' '));


Вроде работает, но есть косяки:

Не придумал что делать если новый текст длиннее исходного (я пробегаюсь только по исходному массиву).

keen,
Как Вы и говорили косяки со знаками препинания. Вроде это можно сделать регулярными выражениями, но в них я не силен, как бы мне выделить в отдельные элементы массива знаки препинания так, чтобы потом оно нормально склеилось в строку и не потерять при этом знаки?

И ещё, мой алгоритм не выводит в первом массиве 2 одинаковых слова :(

Demath 27.08.2013 15:49

Цитата:

Сообщение от tsigel
И ещё, мой алгоритм не выводит в первом массиве 2 одинаковых слова

А, вообще, почему из первого массива должно что-то выводится?

____________

Цитата:

Сообщение от tsigel
Есть 2 текста, по идее эти тексты должны не сильно отличаться друг от друга. Задача найти изменения в этом тексте и выделить цветом.

"в этом тексте" - в каком именно: в 1-ом или 2-ом или в обоих сразу?

Приведите примеры.

tsigel 27.08.2013 15:52

Не совсем. На странице представлены 2 версии документа. text1 текст данного поля из более старой версии, text2 - соответственно более новой. Необходимо цветом выделить изменения в обоих документах. И в старом и в новом. Чтобы оператор при работе с ними не искал читая одинаковые документы.

tsigel 27.08.2013 15:54

У документов есть поля для редактирования, так что функция не должна быть рассчитана на обработку больших количеств текста за 1 заход.

Оптимизация и скорость работы тоже не волнует, т.к. Функция запускается однократно при загрузке страницы.

Demath 27.08.2013 15:59

Например, для

var text1 = "Мама мыла очень кривую раму";
var text2 = "Мама долго мыла кривую раму";

какие слова нужно вывести?

tsigel 27.08.2013 16:07

Demath,
Для данных текстов:
text1 = "Мама мыла <span class='changedText'>очень</span> кривую раму"
text2 = "Мама <span class='changedText'>долго</span> мыла кривую раму"


И из первого исчезло "очень", мы его выделяем, а во втором добавилось "долго", его мы тоже выделяем.

Удивительно, но скрипт выше правильно отрабатывает данные тексты :blink: :)

По идее, если бы тексты были такие:
var text1 = "Мама мыла кривую раму";
var text2 = "Мама мыла раму";

То необходимо было бы в первом тексте выделить "кривую", а второй оставить неизменным.

tsigel 27.08.2013 16:23

Цитата:

Сообщение от Demath
Цитата:

Сообщение от tsigel
И ещё, мой алгоритм не выводит в первом массиве 2 одинаковых слова

А, вообще, почему из первого массива должно что-то выводится?

Есть документ, пользователь может посмотреть изменения этого документа. При просмотре у него на экране 2 версии одного документа, слева старая, справа - новая.

Цитата:

Сообщение от Demath
Цитата:

Сообщение от tsigel
Есть 2 текста, по идее эти тексты должны не сильно отличаться друг от друга. Задача найти изменения в этом тексте и выделить цветом.

"в этом тексте" - в каком именно: в 1-ом или 2-ом или в обоих сразу?

Изменения надо подсвечивать в 2х документах.

tsigel 27.08.2013 16:24

Прошу прощения если непонятно объясняю.

Demath 27.08.2013 16:26

Почитайте перед сном симметрическая разность :)


function DiffArrays(A,B)
{
    var M = A.length, N = B.length, C = [];
    for (var i=0; i<M; i++)
     { var j = 0;
       while (B[j]!==A[i] && j<N) j++;
       if (j==N) C[C.length] = A[i];
     }
   return C;
}

function SymmDiffArrays(A,B)
{
   return DiffArrays(A,B).concat( DiffArrays(B,A) );
}
 
var text1 = "Мама мыла очень кривую раму",
    text2 = "Мама долго мыла кривую раму",
    arr1 = text1.split(' '),
    arr2 = text2.split(' ');
 
alert( SymmDiffArrays(arr1, arr2) );

tsigel 27.08.2013 16:30

Demath,
Спасибо за ответ, учу матчасть! :write:


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