Jaki jest najłatwiejszy sposób na podkreślenie różnicy między dwoma ciągami znaków w PHP?
Myślę wzdłuż linii strony historii edycji Stack Overflow, gdzie nowy tekst jest zielony, a usunięty tekst jest na czerwono. Byłoby idealnie, gdyby były dostępne jakieś gotowe funkcje lub klasy.
Właśnie napisałem klasę, aby obliczyć najmniejszą (nie rozumieć dosłownie) liczbę zmian, aby przekształcić jeden ciąg w inny:
http://www.raymondhill.net/finediff/
Posiada funkcję statyczną do renderowania wersji HTML pliku diff.
Jest to pierwsza wersja i prawdopodobnie zostanie ulepszona, ale na razie działa dobrze, więc wyrzucam ją na wypadek, gdyby ktoś musiał wydajnie wygenerować kompaktowy diff, tak jak potrzebowałem.
Edycja: jest teraz na Github: https://github.com/gorhill/PHP-FineDiff
źródło
Jeśli chcesz mieć solidną bibliotekę, Text_Diff (pakiet PEAR) wygląda całkiem nieźle. Ma całkiem fajne funkcje.
źródło
To fajne, także http://paulbutler.org/archives/a-simple-diff-algorithm-in-php/
źródło
if($matrix[$oindex][$nindex] > $maxlen){
Undefined variable: maxlen
Oto krótka funkcja, której możesz użyć do porównania dwóch tablic. Implementuje algorytm LCS :
Generuje dwie tablice:
Jeśli wypełnisz tablicę znakami, można jej użyć do obliczenia różnicy między wierszami. Teraz wystarczy jeden krok, aby podkreślić różnice:
Na przykład.:
Wyświetli:
S
tackOkiedykolwiekfaFaulowtDodatkowe uwagi:
źródło
computeDiff is not found
Istnieje również rozszerzenie PECL dla xdiff:
W szczególności:
Przykład z podręcznika PHP:
źródło
Miałem straszne kłopoty z przedstawionymi alternatywami opartymi na PEAR i prostszymi. Oto rozwiązanie, które wykorzystuje polecenie Unix diff (oczywiście musisz być w systemie Unix lub mieć działające polecenie różnicowania systemu Windows, aby działało). Wybierz swój ulubiony katalog tymczasowy i jeśli wolisz, zmień wyjątki na kody zwrotne.
źródło
To najlepszy, jaki znalazłem.
http://code.stephenmorley.org/php/diff-implementation/
źródło
$sequence1 = $string1; $sequence2 = $string2; $end1 = strlen($string1) - 1; $end2 = strlen($string2) - 1;
z$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;
To, czego szukasz, to „algorytm różnicowania”. Szybkie wyszukiwanie w Google doprowadziło mnie do tego rozwiązania . Nie testowałem tego, ale może zrobi to, czego potrzebujesz.
źródło
Port php Neila Frasersa diff_match_patch (na licencji Apache 2.0)
źródło
Poleciłbym przyjrzeć się tym niesamowitym funkcjom z rdzenia PHP:
similar_text - Oblicz podobieństwo między dwoma ciągami
http://www.php.net/manual/en/function.similar-text.php
levenshtein - Oblicz odległość Levenshteina między dwoma strunami
http://www.php.net/manual/en/function.levenshtein.php
soundex - Oblicz klucz soundex łańcucha
http://www.php.net/manual/en/function.soundex.php
metaphone - Oblicz klucz metafonu dla ciągu
http://www.php.net/manual/en/function.metaphone.php
źródło
Natknąłem się na tę klasę różnicową PHP autorstwa Chrisa Boultona opartą na difflib Pythona, która może być dobrym rozwiązaniem:
PHP Diff Lib
źródło
Inne rozwiązanie (do porównania side-by-side w przeciwieństwie do ujednoliconego widoku): https://github.com/danmysak/side-by-side .
źródło