2 Strings vergleichen

Rios

Erfahrenes Mitglied
Hi Leute,

Ich habe folgendes Problem/Aufgabe:

Habe jeweils 2 strings, die Ich vergleichen muss und eventuelle Unterschiede sollen farbig markiert werden.
Beispiel:
PHP:
$string1 = "hallo welt";
$string2 = "hhallo welt";

//gewünschter Ausgabe string
$ausgabe = "h<font color='red'>h</font>allo ";

d.h. es sollen nur jeweils die nicht übereinstimmenden Buchstaben farbig markiert werden, nicht das ganze Wort.

Bevor Ich mir jetzt ne Funktion dafür selber überlege, woltle Ich mal fragen ob einer schon mal sowas ähnliches gemacht oder gesehen hat.
 
Hmm, hab mir mal ein paar Gedanken gemacht und herausgekommen ist folgende Funktion (bis jetzt hat sie funktioniert, sie besitzt aber sicherlich Schwachstellen). Ich bitte um Feedback :)
PHP:
<?php
$str1 = 'hallo welt';
$str2 = 'hhallo welt';

function vgl($str1, $str2)
{
    $i = 0;
    $j = 0;
    while ($i < strlen($str2)) {
        if ($str2{$i} != $str1{$j}) {
            $vgl_str .= '<font color="#FF0000">'.$str2{$i}.'</font>';
            $i++;
        } else {
            $vgl_str .= $str2{$i};
            $i++;
            $j++;
        }
    }
    return $vgl_str;
}

echo vgl($str1, $str2);
?>
 
danke für die funktion, hatte auch einen ähnlichen Ansatz. Für diesen speziellen Fall, dass ein Zeichen doppelt geschrieben ist funktioniert es gut, aber wenn buchstaben falsch geschrieben werden, wie z.B. statt "hallo" "hello" dann färbt er den ganzen Rest des Wortes ein. Mal sehen ob Ich das umbauen kann. :)
 
ja ich merke auch gerade, dass die Funktion nur geeignet ist, wenn strlen($str2) > strlen($str1) ist.
Mal schaun, ob ich Zeit finde, um dafür ne Lösung auszutüfteln.

//EDIT2: Jetz funktioniert es mit längeren, gleich langen und kürzeren Strings als $str1:
PHP:
<?php
$str1 = 'hallo welt';
$str2 = 'hello welt';

function vgl($str1, $str2)
{
    $i = 0;
    $j = 0;
    $n = (strlen($str2) >= strlen($str1)) ? strlen($str2) : strlen($str1);
    while ($i < $n) {
        if ($str2{$i} != $str1{$j}) {
            if (strlen($str2) > strlen($str1)) {
               $vgl_str .= '<font color="#FF0000">'.$str2{$i}.'</font>';
                $i++;
            } elseif (strlen($str2) < strlen($str1)) {
                $vgl_str .= '<b>'.$str1{$j}.'</b>';
                $j++;
            } else {
               $vgl_str .= '<font color="#FF0000">'.$str2{$i}.'</font>';
                $i++;
                $j++;
            }
        } else {
            $vgl_str .= $str2{$i};
            $i++;
            $j++;
        }
    }
    return $vgl_str;
}

echo vgl($str1, $str2);
?>
wenn Zeichen aus $str1 fehlen, werden sie fett markiert, ansonsten rot.
Allerdings funktioniert das Ganze nur, wenn inmitten der Zeichenkette ein Zeichen nicht übereinstimmt (wenn auch immer abwechselnd, also richtiges Zeichen, falsches Zeichen, richtiges Zeichen etc.). Sollten mehrere aufeinanderfolgende nicht übereinstimmen, dann funktioniert das Ganze nicht mehr.
 
Zuletzt bearbeitet:
argh das ist mehr als trickreich, ich hatte folgendes:

PHP:
function vgl($str1, $str2)
{
    $i = 0;
    $j = 0;
    if(strlen($str1) > strlen($str2))
    {
        $temp = $str1;
        $str1 = $str2;
        $str2 = $temp;
    }
    while ($i < strlen($str2))
    {
        if ($str2{$i} != $str1{$j} && (strlen($str1)!=strlen($str2)))
        {
            $vgl_str .= '<font color="#FF0000">'.$str2{$i}.'</font>';
            $i++;
        }
        else if (strlen($str1)==strlen($str2) && ($str2{$i} != $str1{$j}))
        {
           $vgl_str .= '<font color="#FF0000">'.$str2{$i}.'</font>';
            $i++;
            $j++;
        }
        else
        {
            $vgl_str .= $str2{$i};
            $i++;
            $j++;
        }
    }
    return $vgl_str;
}

das kriegt allerdings Probleme wenn ich Fehler in z.B. beiden Wörtern drin hab.

//EDIT:
Das Problem ist, dass Ich nicht von vornerein sagen kann: string1 ist der richtige oder string2, sondern ich muss nur die Unterschiede rauspicken..
Wenn Ich nur in den str2 Fehler einbaue geht es, aber sobald ich in str2 und in str1 fehler einbaue gehtsn icht mehr richtig :mad:
 
Zuletzt bearbeitet:
Hallo,

meine Lösung

PHP:
$string1 = "Hallo";
$string2 = "Holla";

$selected = ($a = strlen($string1) > $b = strlen($string2)) ? $a : $b;
for($j=0; $j<$selected; $j++)
{
	$stringPuffer1 = substr($string1, $j, strlen($string1));
	$stringPuffer2 = substr($string2, $j, strlen($string2));

	echo vergleich($stringPuffer1, $stringPuffer2);
	unset($stringPuffer1, $stringPuffer2);	
}

function vergleich($string1, $string2)
{
	$buchstabeMarkiert = $string2{0};
	if($string1{0} != $string2{0}) {
		$buchstabeMarkiert = "<font style=\"color:red;\">".$string2{0}."</font>";
	}
	return $buchstabeMarkiert;
}

Sagt mir bitte, ob Ihr das so in der Art meint: Das würde mir in der Ausgabe "Holla" das "o" und das "a" rot darstellen!
Was auch nicht im anderen String ist wird auch rot markiert!

Ciao nauti

//edit: Ich wollts zwar rekursiv lösen aber da gab mein Apache immer "Seite nicht vorhanden aus"... warum auch immer ... !? Java hätte da nicht gemäckert :)
 
Zuletzt bearbeitet:
danke für deine Hilfe nautilus, habs grad getestet, allerdings geht deine Funktion nicht, wenn ich z.B. "hallo" und "hllo" vergleiche :)

Was ich mir noch überlegt hätte, wäre den string in die einzelnen Wörter zu zerlegen und dann einzeln zu vergleichen, allerdings hab ich dann Probleme bei Fällen wenn ich ne unterschiedliche Anzahl von Wörtern hab, z.B.
"hallo welt"
"hallo du schöne welt"
 
Du könntest jeden String nach einem " " (Leerzeichen) trennen und in ein Array füllen.

Jedes Wort bekommt dann eine Zahl zugeordnet...

"Hallo du schöne Welt"
0: Hallo
1: du
2: schöne
3: Welt

"Hallo Welt"
0: Hallo
1: Welt

Wenn Wort 0 von String 1 nicht Wort 0 vom String 2 ist dann wird es rot markiert wenn es gleich ist benutzt du irgendeine Funktion von oben zum Kontrollieren der Buchstaben. Wenn das nächste Wort wieder nicht dasselbe ist dann wieder rot markieren aber wenns das selbe ist dann wird es nicht rot markiert aber die Buchstabenkontrolle wird doch durchgeführt.

So in der Art, aber noch viel komplizierter wirds erst wenn man dran sitzt und die Probleme kommen auf :)

ciao nauti
 
Zuletzt bearbeitet:
äh entweder du hast dich grad widersprochen oder mir raucht der Kopf schon zu sehr :-)

Wenn die Wörter gleich sind, brauch ich doch keine Buchstabenkontrolle mehr.
Mir fällt jetzt keine Möglichkeit ein, wie ich prüfen könnte, ob zwischendrin Wörter fehlen oder zuviel sind
 
Zurück