Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Różnice stringów
Forum PHP.pl > Forum > PHP
daris
Mam przykładowe dwa stringi:
  1. <?php
  2. $str = 'To jest jakiś tekst, który ma coś tam';
  3. $str2 = 'To jest patchowany tekst, który nie ma coś tam';
  4. ?>

i teraz chciałbym znaleźć różnice między nimi, czyli żeby mi wyświetliło coś w rodzaju:
Cytat
To jest jakiś tekst, który ma coś tam
To jest patchowany tekst, który nie ma coś tam


Takie rozwiązanie występuje z tego co widziałem w cvs'ach (system kontroli wersji czy jak to tam się nazwywa). Tutaj przykład (tam jest pewnie to robione na podstawie diff'a ale ja chciałbym to zrobić porównując stringi)

Istnieje już gdzieś taka funkcja? Chicałem sam to napisać ale nie za bardzo wiem na jakiej podstawie to może działać. Trzeba by chyba porównywać znak po znaku.
.radex
nie słyszałem o gotowej funkcji, ale w systemach wiki masz coś takiego - możesz zobaczyć jak to działa i na tym się wzorować przy pisaniu własnej funkcji
GrayHat
W pakiecie PEAR jest biblioteka Text_Diff:
http://pear.php.net/package/Text_Diff
daris
To co podał GrayHat to nie wiem co mam z tym zrobić.

Wziąłem się sam za pisanie odpowiedniej funkcji i już jestem blisko. Sprawdzam nie tak jak wyżej pisałem litera po literze tylko wyraz po wyrazie (na początku dzielę wyrażeniem regularnym bo potem może mi się to przydać jak nie tylko przez spacje będę dzielił)
  1. <?php
  2. function diff($str, $str2) {
  3.  
  4. $ret = preg_split("/[s]/", $str);
  5. $ret2 = preg_split("/[s]/", $str2);
  6.  
  7. echo "<pre>";
  8. echo '<b>pierwszy</b><br />';
  9. print_r($ret);
  10. echo '<b>drugi</b><br />';
  11. print_r($ret2);
  12. $diff = array_diff($ret, $ret2);
  13.  
  14. echo '<b>roznice miedzy 1 a 2</b><br />';
  15. print_r($diff);
  16.  
  17. foreach($ret as $k => $r) {
  18. if ($ret[$k] == $diff[$k]) // jest rozne
  19. echo '<span style="color:red">'.$r.'</span> ';
  20. else
  21. echo $r.' ';
  22. }
  23.  
  24. echo '<br />';
  25.  
  26. echo '<b>roznice miedzy 2 a 1</b><br />';
  27.  
  28. $diff2 = array_diff($ret2, $ret);
  29. print_r($diff2);
  30.  
  31. foreach($ret2 as $k => $r) {
  32. if ($ret2[$k] == $diff2[$k]) // jest rozne
  33. echo '<span style="color:green">'.$r.'</span> ';
  34. else
  35. echo $r.' ';
  36. }
  37.  
  38. echo "</pre>";
  39.  
  40. }
  41. ?>

Tylko że jeszcze nie działa tak jak powinno jak dany tekst istnieje w drugim ale na dalszej pozycji, czyli nie za działa poprawnie dla:
Cytat
To jest jakiś tekst, który ma coś tam
To jest patchowany tekst, który nie ma jakiś coś tam
em1X
Eh Ty się już tyle dni męczysz, a rozwiązanie jest gotowe i można działać w ciągu 5 minut.
Zainstaluj najpierw PEAR. Pobierz bibliotekę text_diff i działaj.
daris
Nie lepiej było tak od razu? winksmiley.jpg
Nie wiedziałem że to takie proste:
Kod
pear install text_diff

biggrin.gif coś jak apt-get ;P

OK częściowo już mam to zrobione (rozwaliłem tekst na tablicę - każdy element tablicy to nowy znak), teraz będzie trzeba na podstawie diffa przeparsować html'a tongue.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.