Как выделить изменения / отличия в одном текстовом абзаце от другого? - PullRequest
3 голосов
/ 14 июля 2009

Можно ли выделить изменения в одном текстовом абзаце из другого?

Например, в базе данных есть 3 текстовых поля. Пользователи без прав администратора могут редактировать текст и отправлять на утверждение. Когда администратор входит в систему, он (а) может открыть страницу одобрений, на которой показан исходный текст и текст, представленный пользователем, с изменениями. Обычно эти изменения очень малы по своей природе, такие как исправление орфографии или просто удаление или добавление предложения.

Может ли оно быть представлено таким образом, чтобы изменения (из исходного текста) были выделены так, чтобы пользователям с правами администратора не приходилось проверять каждое поле и каждую строку, прежде чем они одобрили его?

Любая помощь будет оценена. Спасибо.

Обновлено: Несколько похоже на выделение изменений кода TortoiseSVN.

Ответы [ 4 ]

3 голосов
/ 14 июля 2009

Если вы знакомы с инструментами GNU / Linux, вы можете быть знакомы с инструментом `diff '.

И кто-то написал полнофункциональный diff для сравнения файлов / строк в php.

Вы можете найти его здесь: Пример php diff .

2 голосов
/ 15 июля 2015

Это старая ветка, но я решил занести в каталог свои выводы.

Если вы хотите использовать сырой php, это, безусловно, самое простое, быстрое и эффективное решение, которое я нашел: http://paulbutler.org/archives/a-simple-diff-algorithm-in-php/

Из того, что я могу сказать, автор приведенного выше кода использует алгоритм, описанный в этой статье: http://www.codeproject.com/Articles/6943/A-Generic-Reusable-Diff-Algorithm-in-C-II

Основное описание происходящего (взято из статьи):

  • Найти текущую самую длинную совпадающую последовательность (LMS) предметов.
  • Сохраните эту LMS в куче результатов.
  • Обработка всех данных, оставшихся над LMS, с использованием рекурсии.
  • Обрабатывать все данные, оставленные ниже LMS, с помощью рекурсии.

Работает как шарм!

1 голос
/ 15 мая 2018

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

string1 = "The quick brown fox jumps over the lazy dog.";
$string2 = "The quick brown albino fox jumps the groovy dog.";

$string1 = explode(" ", $string1);
$string2 = explode(" ", $string2);

$diff = array_intersect($string2, $string1);

$tmp = array();
foreach ($string2 as $k => $w) {
         if ($diff[$k]==$w) {
             $tmp[$k] = $w;
         }
         else {
               $tmp[$k] = "<b>$w</b>";
         }
}
$diff = array_diff($string1, $tmp);

foreach ($diff as $k => $w) {
         $tmp[$k] .= " [<strike>$w</strike>]";
}

echo join (' ', $tmp);

исх. https://forums.phpfreaks.com/topic/6525-how-do-i-highlight-differences-between-strings/

...