Сравнение строк / абзацев / документов в php

#php #mysql #apache

#php #mysql #apache

Вопрос:

Я пытаюсь добавить функцию для создания отчета о различиях между 2 разделами текста из 20 000 символов. Я немного погуглил и услышал о библиотеке Pear diff, которая была прекращена, и нашел это: https://github.com/paulgb/simplediff/blob/5bfe1d2a8f967c7901ace50f04ac2d9308ed3169/simplediff.php

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

Комментарии:

1. Будет ли эта функция использоваться на постоянной основе или один раз? При одноразовом использовании я бы добавил два файла в систему управления версиями, а затем сопоставил файлы друг с другом.

2. Это будет по требованию наших клиентов, так что это будет постоянно

3. Проверьте CakePHP и Zend Framework, у них может быть что-то в своих библиотеках, что касается такого типа ситуации. Другим решением может быть Lucene / Solr, но для его ускорения потребуется больше времени.

Ответ №1:

Я использую этот код в живом проекте http://svn.geograph.org.uk/svn/branches/british-isles/libs/3rdparty/simplediff.inc.php

Пример использования http://svn.geograph.org.uk/svn/branches/british-isles/public_html/article/diff.php

но код очень прост

 $a1 = explode("n",$file1);
$a2 = explode("n",$file2);
print diff2table($a1,$a2);
  

(код просто принимает входные данные в виде массивов и выводит html-таблицу. Но diff2table можно настроить)

Комментарии:

1. дох! вижу, вы уже нашли simplediff. Но, возможно, показанное мной использование помогает. Я обнаружил, что это работает в реальном мире. Он отлично работает с документами со 100 тыс. строк.

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

3. Догадки? что, черт возьми, это значит?

4. С помощью этого кода я запустил тест, добавляющий новое содержимое в строку, и отчет о различиях не был точным. Локальный, да, точный, нет. Я взял строку «Страхование по низкой цене» и добавил «Вы можете получить» перед ней. Он показал <del>Insurance</del> и <ins>You can get Insurance</ins> … на самом деле это не должно показывать, что что-то было удалено.