@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
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы