Как сделать текст DIFF с помощью PHP? - PullRequest
5 голосов
/ 10 апреля 2009

Каков наилучший способ сделать это для PHP? Есть ли какая-либо функция PHP, которая может сделать это, учитывая, что содержимое столбца может быть очень большим?

Если функция PHP недоступна, какую утилиту оболочки я могу вызвать?

спасибо

Ответы [ 3 ]

10 голосов
/ 10 апреля 2009

в PHP нет встроенных функций сравнения. но, ура для PEAR: Text_Diff (никогда не использовал это жестко, но в PEAR я верю).

и есть даже пакет PECL, xdiff

подсказка: классы pear - это чистый php, пакеты pecl - это модули. Обычно модули работают быстрее классов, но это также зависит от функциональности. Вы просто должны проверить и оценить.

для хранения: я бы сохранял обычный текст, а не различия. Пространство дешево, многие базы данных (например, mysql) поддерживают сжатие данных (или вы можете де / сжать в php), но если вы сохраняете открытый текст, вы не зависите от алгоритма diff и можете изменить его позже, если потребуется.

если вам нужна скорость, вы можете хранить как открытые тексты, так и различия.

4 голосов
/ 10 апреля 2009

Обычный процесс заключается в сохранении каждой отдельной ревизии и вычислении разницы, когда пользователь хочет ее просмотреть, возможно, кеширование этого вывода, если процесс дорогой.

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

В любом случае, необходимо сделать уступку; первый вариант делает получение определенных версий недорогим, за счет чего требуется немного больше обработки, необходимой для различий; вторая делает просмотр diff дешевым, но за счет потенциально дорогих инкрементальных исправлений для получения конкретной версии.

0 голосов
/ 10 апреля 2009

Если содержимое очень большое и изменения незначительны, вы можете рассмотреть вариант «обратный дельта»: только последняя версия текста сохраняется в полном формате, а предыдущая версия представляет собой разность от последней версии к предыдущей.

Это сэкономит много места для хранения, но если сравнивать две версии, где количество модификаций велико, стоимость процесса может быть значительной. В конце концов, это всегда компромисс между объемом памяти и требованиями к обработке.

Если вы не можете или не хотите использовать PEAR и PECL, вы все равно можете использовать утилиту diff, вызванную exec. Я бы точно выбрал стандартный формат diff и никогда не разработал собственный.

...