# 2 Strings vergleichen



## Rios (13. April 2004)

Hi Leute,

Ich habe folgendes Problem/Aufgabe:

Habe jeweils 2 strings, die Ich vergleichen muss und eventuelle Unterschiede sollen farbig markiert werden.
Beispiel:

```
$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.


----------



## ludz (13. April 2004)

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
$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);
?>
```


----------



## Rios (13. April 2004)

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.


----------



## ludz (13. April 2004)

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
$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.


----------



## Rios (13. April 2004)

argh das ist mehr als trickreich, ich hatte folgendes:


```
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


----------



## nautiLus` (13. April 2004)

Hallo,

meine Lösung


```
$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


----------



## Rios (13. April 2004)

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"


----------



## nautiLus` (13. April 2004)

hmmm 
Da hast Du recht... scheint doch eine etwas komplexere Funktion zu werden!
Mal schaun.

mfg nauti


----------



## nautiLus` (13. April 2004)

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


----------



## Rios (13. April 2004)

ä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


----------



## nautiLus` (13. April 2004)

Da hast du natürlich recht 
Entschuldige ... der wirrwarr von Code in meinem Kopf macht mich schon fertig ....


mfg nauti


----------



## ludz (13. April 2004)

Hehe, die ganze Sache ist aber auch verzwickt  
Wie gesagt, wenn ich irgendwann nochmal Zeit finde, dann bastel ich evtl. nochmal was.

Ich glaube nautis Vorschlag mit Arrays usw. könnte in die richtige Richtung gehen...


----------

