PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PHP: Es wird haarig: Zwei Strings vergleichen und Unterschiede hervorheben?


mf_2
2006-12-06, 20:07:34
Hallo,
Ich habe ein Wiki, welches die verschiedenen Versionen der versch. Seiten in einer MySQL Datenbank ablegt. Nun möchte ich zwei Versionen miteinander vergleichen und die Unterschiede farbig hervorheben. Das geht mit der eingebauten "Diff-Engine" vom PHPWiki (mein Wikisystem) schon sehr gut. Leider scheitere ich jedoch daran, diese Engine in meinem Script einzusetzen. Das Script sagt mir dann immer "Versionen sind identisch.", obwohl das definitiv zwei verschiedene Versionen sind, hab mir nämlich die Strings vorher ausgeben lassen am Bildschirm und da seh ich das.
Gibt es so eine Engine, welche irgendwie leichter in eigene Scripte eingebaut werden kann? Es ist halt verdammt komplex, das Teil vom PHPWiki hat über 1000 Zeilen. Deswegen ist auch 'mal eben selber proggen' ned so der Hit. Vllt. gibt es sowas ja auch schon als Freeware irgendwo. Nur die Suche nach Stringvergleichen unter PHP blieb via Google recht erfolglos, die verwiesen mich immer auf strcmp(), aber das macht nicht ganz das was ich will.

Hier das noch am ehesten brauchbare Script der Google Suche:



// this shit is brought to you by benny[at]4webmaster.net

$string_1 = $old_content;
$string_2 = $page_content;

$str_len_1 = strlen($string_1);
$str_len_2 = strlen($string_2);

$string_array_1 = array();
for($a=0; $a<$str_len_1; $a++)
$string_array_1[] = $string_1{$a};

$string_array_2 = array();
for($a=0; $a<$str_len_2; $a++)
$string_array_2[] = $string_2{$a};

if($str_len_1 >= $str_len_2)
$loop = $str_len_1;
else
$loop = $str_len_2;
////////////////////////////////////////////////////////////
$my_string_array = array();
$my_string_bad_array = array();

$next = 0;
$next_bad = 0;
for($a=0; $a<$loop; $a++)
{
if($string_array_1[$a] == $string_array_2[$a])
{
$my_string_array[$next] .= $string_array_2[$a];
$next_bad++;
}
else
{
$my_string_array[$next_bad] .= "";
$my_string_bad_array[$next_bad] .= $string_array_2[$a];
array_splice($string_array_2, $a, 1);
$loop = count($string_array_2);
$a--;
$next++;
}
}

foreach($my_string_array as $key => $value)
{
if(!$value)
{
$my_string_array[$key] = "<b>".$my_string_bad_array[$key]."</b>";
}
}

$diff="";

foreach($my_string_array as $value)
//echo $value;
$diff .= $value;



Leider scheitert des an Strings, bei denen was rausgestrichen wurde und bei solchen Strings, die an mehreren Stellen editiert wurden, zwischendurch aber wieder identisch sind.

Wisst ihr da weiter?

Vielen Dank schon einmal,
mf_2

mf_2
2006-12-08, 12:56:46
*push*
Weiss denn keiner was?

The_Invisible
2006-12-08, 15:54:32
bei phpwiki ist imho die diff "engine" eh schön in einer klasse verpackt, brauchst also nur das entsprechende file includen und dir ansehen wie die diff routine bei phpwiki aufgerufen wird

mfg