Какой самый простой способ выделить разницу между двумя строками в PHP?
Я думаю о том, что происходит на странице истории редактирования переполнения стека, где новый текст выделен зеленым, а удаленный - красным. Если есть какие-либо заранее написанные функции или классы, это было бы идеально.
Просто написал класс для вычисления наименьшего (не считаться буквально) количества правок для преобразования одной строки в другую:
http://www.raymondhill.net/finediff/
Он имеет статическую функцию для отображения HTML-версии diff.
Это первая версия, и, вероятно, она будет улучшена, но на данный момент она работает отлично, поэтому я добавлю ее на тот случай, если кому-то понадобится создать компактный файл эффективно, как мне и нужно.
Изменить: сейчас на Github: https://github.com/gorhill/PHP-FineDiff
источник
Если вам нужна надежная библиотека, Text_Diff (пакет PEAR) выглядит неплохо. У него есть довольно интересные функции.
источник
Это хороший, также http://paulbutler.org/archives/a-simple-diff-algorithm-in-php/
источник
if($matrix[$oindex][$nindex] > $maxlen){
Undefined variable: maxlen
Вот короткая функция, которую вы можете использовать для сравнения двух массивов. Он реализует алгоритм LCS :
Генерирует два массива:
Если вы заполняете массив символами, его можно использовать для вычисления встроенной разницы. Теперь просто один шаг, чтобы выделить различия:
Например.:
Будет выводить:
S
TackoерверееФолвлTДополнительные замечания:
источник
computeDiff is not found
Существует также расширение PECL для xdiff:
В частности:
Пример из руководства по PHP:
источник
У меня были ужасные проблемы с показанными на основе PEAR и более простыми альтернативами. Итак, вот решение, которое использует команду Unix diff (очевидно, вы должны быть в системе Unix или иметь работающую команду Windows diff для ее работы). Выберите ваш любимый временный каталог и измените исключения на коды возврата, если хотите.
источник
Это лучший, который я нашел.
http://code.stephenmorley.org/php/diff-implementation/
источник
$sequence1 = $string1; $sequence2 = $string2; $end1 = strlen($string1) - 1; $end2 = strlen($string2) - 1;
на$sequence1 = preg_split('//u', $string1, -1, PREG_SPLIT_NO_EMPTY); $sequence2 = preg_split('//u', $string2, -1, PREG_SPLIT_NO_EMPTY); $end1 = count($sequence1) - 1; $end2 = count($sequence2) - 1;
То, что вы ищете, это «алгоритм сравнения». Быстрый поиск в Google привел меня к этому решению . Я не проверял это, но, возможно, он будет делать то, что вам нужно.
источник
Порт php Neil Frasers diff_match_patch (лицензированный Apache 2.0)
источник
Я бы порекомендовал посмотреть на эти удивительные функции из ядра PHP:
Similar_text - вычислить сходство между двумя строками
http://www.php.net/manual/en/function.similar-text.php
Левенштейн - вычислить расстояние Левенштейна между двумя строками
http://www.php.net/manual/en/function.levenshtein.php
soundex - вычисляет ключ soundex строки
http://www.php.net/manual/en/function.soundex.php
metaphone - вычисляет метафоновый ключ строки
http://www.php.net/manual/en/function.metaphone.php
источник
Я наткнулся на этот класс PHP diff от Chris Boulton, основанный на Python difflib, который может быть хорошим решением:
PHP Diff Lib
источник
Другое решение (для параллельного сравнения в отличие от унифицированного представления): https://github.com/danmysak/side-by-side .
источник