Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Porównywanie ciągów
Forum PHP.pl > Forum > Przedszkole
ayeo
Witam!
Przykład:

$a = "Ala ma kota"
$b = "Ala nie ma kota"

Chciałbym wyciągnąc róznice pomiędzy ciągami, w tym przypadku "nie". Ma ktoś jakieś pomysły?

Myślałem, żeby każdy wyraz dodawać do tablicy i dalej z tym kombinować, ale szukam czegos prostego. Stringi będą długie np. 2 kartki A4 smile.gif
pavobe
Ja bym dał coś takiego:

Kod
if ($a == $b)
     echo 'Takie same';
else
     echo 'Inne';


Nie znam się za bardzo, ale to będzie jakoś tak winksmiley.jpg
ayeo
Wielkie dzięki! Tylko nie o to chodzi smile.gif Przykładem nich będzie Wikipedia. Jak wejdziesz w historie edycji to pokazuje Ci co zostało zmienione w stosunku do poprzedniego wpisu. Czyli coś dodane, coś usunięte, coś zmienione (czyli usunięte + zmienione). Chodzi mi o to jak to ugryźć jakoś elegancko.
ayeo
Ok dzięki biggrin.gif
no_face
O ile same roznice byloby latwo zrobic, to by napisac skrypt, ktory wykrywalby roznice takie jak usuniecie, zmiane itd, bedzie trudniej. Nie kazde wystapienie jednego slowa w nowym tekscie mogloby byc brane jako zmiana, tylko z tego powodu, ze w innym miejscu przy porownaniu te slowo zostalo zmienione. Na szybko moza zasugerowac badanie ciagu krok po kroku.
ayeo
myślałem o tablicach. W sensie rozbić zdania na wyrazy i każdy przypisać do tablicy. Ale co dalej jest tyle If'ów w mojej głowie smile.gif
no_face
Na dzien dzisiejszy gotowego pomyslu nie mam, podsune tylko rozumowanie.

Kod
ala     ma kota ta te ti
ala nie ma kota ta    ti


napisz skrypt, ktory tak to bedzie widzial smile.gif w tym czasie masz jak na dloni "dodany" i "usuniety" tekst. Zmieniony potraktuj jako dodany.

Jesli przyjdzie mi jakies mniej filozoficzne rozwiazanie, dam znac.
ayeo
Tak to widze właśnie smile.gif ale co jeśli:
$a = "Kota ala ma"
$b = "Ala ma kota"

proste porównanie tablic da 100% zgodność... ważne jest to, że Ala występuje po ma, a ma itd...

Myślałem, żeby podzielić tego stringa na linijki i sprawdzac całe linije, ale to troche bez sensu. Można dzielić na zdania, ale nie każdy stawia kropke na końcu smile.gif
no_face
W tym przypadku mozesz potraktowac to jako nowy tekst, ewentualnie edycja czyli cos w stylu:

Kod
kota ala ma
     ala ma kota


Zmiana pozycji rowna sie jakiej edycji w tym czasie slowo "kota" bedzie wystepowalo "nowe".

Chyba, ze chcesz inteligentny system, ktory porownuje logiczna calosc smile.gif
wrcnitro
tongue.gif strasznie spiący jestem moze kilka błedów poełniłem moze wogule nie ma to sensu tongue.gif

  1. <?php
  2. if ($a == $b)
  3.  echo 'Takie same';
  4. else {
  5. $roznica=array();
  6. $x=explode(' ',$a);
  7. $y=explode(' ',$a);
  8. $xl=count($x);
  9. $yl=count($x);
  10. if($xl>=$yl) {
  11. for ($c=0;$c<=$yl;$c++) {
  12. if(!in_array($x[$c],$y)) {
  13. array_push($roznica,$x[$c]);
  14. }
  15. }
  16. } else {
  17. for ($c=0;$c<=$yl;$c++) {
  18. if(!in_array($y[$c],$x)) {
  19. array_push($roznica,$y[$c]);
  20. }
  21. }
  22. }
  23. }
  24. ?>


do tego mozna do ifów dorzucić sprawdzenie indeksów x i y czy sa takie same ;PP a wraz z kolejną różnica odejmowanie indeksów o jeden tongue.gifP i powinno ładnie wszytsko wyjść:P

Pozdrawiam press!!
ayeo
No tak, ale co jeśli:

$a = "Ala ma dużego kota";
$b = "Mała Ala ma kota";

To, że dany wyraz nie znajduje się na tej samej pozycji nic nie znaczy sad.gif W drugim wyrażeniu dodano "Mała"co przesuwa całą reszte, ale treść pozostaje ta sama...

EDIT: istnieje gotowe rozwiązanie pod nazwą Diff Engine winksmiley.jpg
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.