@PoodingRex

Как сравнить два текста с разметкой на js или php?

Доброго времени для, друзья.
Нужно сравнить две версии текста. В тексте присутствует html-разметка. Сделать это можно либо php, либо js, без разницы. Пробовал через prettyTextDiff, который обёртка для google_diff_match_patch.js, но он может работать только с чистым текстом. Костылями и такой-то матерью упросил его работать с разметкой, но на неё он ужасно реагирует. Например, если в текстах будет заменена ul на ol, то выведет uo. И вот тут вообще беда. Не нашёл никакого адекватного решения, проверка длины удалённой/добавленной (>3 символов, например) строки ломает вообще всё.

Вот тут человек столкнулся с такой же проблемой: Клик, поэтому возьму сразу его пример:

Текст 1:
<h1>Заголовок</h1>
Подзаголовок
Мама мыла раму.
Не было тучь на небе.

Текст 2:
<h1>Название</h1>
<h2>Подзаголовок</h2>
Мама мыла пуделя.
В небе были тучи.

Результат:
<h1><span class=old>Заголовок</span> <span class=new>Название</span><h1>
<h2>Подзаголовок</h2>
Мама мыла <span class=old>раму</span> <span class=new>пуделя</span>.
<span class=old>Не было тучь на небе.</span>
<span class=new>В небе были тучи.</span>
  • Вопрос задан
  • 127 просмотров
Решения вопроса 1
@PoodingRex Автор вопроса
Может кому-то тоже понадобится.
Сделал на: https://github.com/gorhill/PHP-FineDiff
Для работы с HTML нужно включить "wordGranularity", вставить пробелы после и перед тэгами, и при выводе прогнать через htmlspecialchars_decode($rendertext), чтобы тэги отобразились не текстом.

<?php
include $_SERVER['DOCUMENT_ROOT'] . '/assets/components/fineDiff/finediff.php';

$original_text = str_replace('>' , '> ', $original_text);
$original_text = str_replace('<' , ' <', $original_text);

$changed_text = str_replace('>' , '> ', $changed_text);
$changed_text = str_replace('<' , ' <', $changed_text);

$opcodes = FineDiff::getDiffOpcodes($original_text, $changed_text, FineDiff::$wordGranularity);


$rendertext =  FineDiff::renderDiffToHTMLFromOpcodes($original_text, $opcodes);

return htmlspecialchars_decode($rendertext);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
erniesto77
@erniesto77
oop, rb, py, php, js
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
24 апр. 2024, в 10:32
400000 руб./за проект
24 апр. 2024, в 10:12
10000 руб./за проект