Как сделать текстовый DIFF с помощью PHP?

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

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

Благодарность


person Community    schedule 10.04.2009    source источник


Ответы (3)


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

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

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

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

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

person stefs    schedule 10.04.2009
comment
Вы можете увидеть здесь, что Text_Diff может использовать xdiff. @hitautodestruct вы можете найти примеры по адресу: груша. php.net/manual/en/ - person ; 10.02.2013

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

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

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

person Rob    schedule 10.04.2009
comment
Но как сделать DIFF в первую очередь? Есть ли в PHP встроенные функции? - person ; 10.04.2009

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

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

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

person Csaba Kétszeri    schedule 10.04.2009