Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Porównywanie zmian w tekście
Forum PHP.pl > Forum > PHP
Riklaunim
piszę komponent do porównywania zmian jakie user zaproponował w artykule:
  1. <?php
  2.  
  3. ....
  4. $ar_old = explode('.', $old);
  5. $ar_new = explode('.', $res->art_body);
  6. }
  7. $changes = array_diff($ar_new, $ar_old);
  8. foreach($ar_new as $val)
  9. {
  10. IF(in_array($val, $changes))
  11. {
  12. // strip_tags, zostawić B/BR/I/U/A/IMG itp.
  13. $ret[] = '<font color=\"red\">'.$val.'</font>';
  14. }
  15. else
  16. {
  17. // strip_tags, zostawić B/BR/I/U/A/IMG itp.
  18. $ret[] = $val;
  19. }
  20. }
  21. $wynik = implode('. ', $ret);
  22. echo $wynik;
  23. ?>

Rozbicie tekstu co "." czy co ". " jest dobre gdy tekst jest typowym tekstem - tj. same zdania... gorzej jak są listy, tabele i inne urozmaicenia smile.gif Znacie może jakieś ciekawe rozwiązania tego problemu?
dag
Pierwsze na myśl przyszło mi sprawdzanie, która z podanych pozycji (</ul>, </table>,</p>,<br/>) jest najbliżej początku tekstu i następnie w zależności od wyniku dalsze działania.
cadavre
Przepraszam za odgrzanie starego kotleta... yyy to znaczy topika, ale uważam to za stosowniejsze niż tworzenie nowego o prawie identycznej treści.

Mam sobie otóż taki skrypt:
  1. <?php
  2. $stary = "Lorem ipzum dolor sit amen, consectetuer adipiscing elit. In dam Ci libero,
     malesuada eget, faucibus ut, aliquam ac, metus. Pellentesque enim pede, sceleris
    que non, porrrrrttitor quis, semper in, lorem. Vaginum et pede sit amet odio euis
    mod molestie. Nullam id erat ut augue commodo convallis. Quisque ligula. Cras ege
    stas, ipsum a ornare mollis, lacus leo hendrerit quam, in consectetuer nunc quam 
    at mauris. Aenean diam. Vivamus imperdiet massa. In feugiat adipiscing sem. Duis orci.Ut scelerisque turpis vita
    e nisi. Sed vel mi nec diam aliquet elementum. Nulla elementum aliquet tortor. Do
    nec vel urna non erat facilisis commodo. Ediotumam laoreet risus ut leo. Null sol
    licitudin accumsan turpis. Duis portu. Pellentesque pulvinar."
    ;
  3.  
  4. $nowy = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In diam libero, m
    alesuada eget, faucibus ut, aliquam ac, metus. Pellentesque enim pede, scelerisqu
    e non, porttitor quis, semper in, lorem. Vestibulum et pede sit amet odio euismod
     molestie. Nullam id erat ut augue commodo convallis. Quisque ligula. Cras egesta
    s, ipsum a ornare mollis, lacus leo hendrerit quam, in consectetuer nunc quam at 
    mauris. Aenean diam. Vivamus imperdiet massa. In feugiat adipiscing sem. Duis orci.Ut scelerisque turpis vita
    e nisi. Sed vel mi nec diam aliquet elementum. Nulla elementum aliquet tortor. Do
    nec vel urna non erat facilisis commodo. Etiam laoreet risus ut leo. Nullam solli
    citudin accumsan turpis. Duis porta. Pellentesque pulvinar."
    ;
  5.  
  6. // STEP 1: rozdziela tekst na zdania
  7. $arr_stary = explode(". ",$stary);
  8. $arr_nowy = explode(". ",$nowy);
  9.  
  10. //STEP 2: dodaje do explodowanego tekstu kropki na koniec
  11. for ($i=0;count($arr_stary)>$i;$i++) {
  12. $arr_stary[$i] = $arr_stary[$i] . ".";
  13. }
  14. for ($i=0;count($arr_nowy)>$i;$i++) {
  15. $arr_nowy[$i] = $arr_nowy[$i] . ".";
  16. }
  17.  
  18. //STEP 3: oblicza różnicę w tablicy
  19. $roznica = array_diff($arr_stary,$arr_nowy);
  20.  
  21. //STEP 4: wykazanie różniących się zdań
  22. $roznice = array_keys($roznica);
  23.  
  24. //STEP 5: wyświetlenie wyników
  25. for ($i=0;count($roznice)>$i;$i++) {
  26. echo "<table width='100%' border='1'><tr><td width='50%'>";
  27. echo $arr_stary[$roznice[$i]];
  28. echo "</td><td width='50%'>";
  29. echo $arr_nowy[$roznice[$i]];
  30. echo "</tr></table><hr>";
  31. }
  32. ?>

Funkcja ta jak (może) widać wykazuje różnice w tekstach. Działa jak należy jednak tylko do pokazywania różnic na poziomie jednego zdania - gdy ilość zdań pozostała niezmienna. Jeśli jednak jakieś zdanie zostało wyrzucone pojawia się problem - array_diff" title="Zobacz w manualu php" target="_manual dobrze pokazuje różnice jednak nie wiem jak wyświetlić to, że jakieś zdanie zostało wyrzucone lub dodane. Wpadłem zatem na pomysł, aby pokazać jedno wcześniejsze i jedno kolejne zdanie. W ten sposób będzie np. "To jest. Zdanie jakieś. Trzecie tam." oraz "To jest. Trzecie tam." - i to pokaże całe te teksty jako porównanie. Użyłbym do tego:
  1. <?php
  2. //STEP 5: wyświetlenie wyników
  3. for ($i=0;count($roznice)>$i;$i++) {
  4. echo "<table width='100%' border='1'><tr><td width='50%'>";
  5. echo $arr_stary[$roznice[$i]-1] . " " . $arr_stary[$roznice[$i]] . " " . $arr_stary[$roznice[$i]+1];
  6. echo "</td><td width='50%'>";
  7. echo $arr_nowy[$roznice[$i]-1] . " " . $arr_nowy[$roznice[$i]] . " " . $arr_nowy[$roznice[$i]+1];
  8. echo "</tr></table><hr>";
  9. }
  10. ?>
I wszystko jest OK, ale tylko w momencie gdy jedno zdanie zostało usunięte. Potem zaczyna się sypać.

Any ideas?

Powiem krótko: potrzebuję czegoś takiego jak na Wiki.
devnul
to moze zajzyj do źródła wiki, przecierz jest to projekt open, zobaczysz jak tam to rozwiązali i po kłopocie
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.