Signatur
Beschreibung
xdiff_string_diff vergleicht zwei als String übergebene Textinhalte und erzeugt einen Unified Diff im Standardformat. Das Ergebnis zeigt hinzugefügte, entfernte und unveränderte Zeilen in einem menschenlesbaren Format, wie es auch von Unix-Werkzeugen wie diff -u erzeugt wird.
Die Funktion gehört zur PECL-Erweiterung xdiff und eignet sich besonders zum Vergleichen von Texten, Quellcode oder Konfigurationsdateien direkt aus dem Arbeitsspeicher heraus, ohne dass Dateien auf dem Dateisystem vorhanden sein müssen. Das macht sie ideal für Web-Anwendungen, die Revisionsvergleiche, Code-Reviews oder Änderungsprotokolle dynamisch generieren.
Der Parameter $context bestimmt, wie viele unveränderte Zeilen rund um geänderte Bereiche in der Ausgabe einbezogen werden – ein höherer Wert ergibt mehr Kontext und damit bessere Lesbarkeit, ein niedrigerer Wert erzeugt kompaktere Diffs. Mit $minimal auf true wird ein möglichst kleines Diff erzeugt, was jedoch rechenzeitintensiver ist.
Das erzeugte Diff-Ergebnis kann anschließend gespeichert, angezeigt oder mit xdiff_string_patch auf andere Texte angewendet werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $old_data Pflicht | string | Der ursprüngliche Text (Ausgangszustand), der als Basis des Vergleichs dient. | |
| $new_data Pflicht | string | Der neue Text (geänderter Zustand), der mit dem alten Text verglichen wird. | |
| $context | int | 3 | Anzahl der unveränderten Kontextzeilen, die rund um Änderungen in die Ausgabe einbezogen werden. Standardmäßig 3. |
| $minimal | bool | false | Wenn true, wird ein minimal mögliches Diff berechnet. Dies kann die Qualität verbessern, ist aber langsamer. |
Rückgabewert
false zurückgegeben.Beispiele
Einfacher Textvergleich mit Unified Diff
<?php
$old = "Zeile 1\nZeile 2\nZeile 3\nZeile 4\n";
$new = "Zeile 1\nZeile 2 geändert\nZeile 3\nZeile 4\n";
$diff = xdiff_string_diff($old, $new);
if ($diff !== false) {
echo $diff;
} else {
echo "Keine Unterschiede gefunden oder Fehler aufgetreten.";
}
Quellcode-Revisionsvergleich mit minimalem Diff
<?php
$altCode = "<?php\nfunction hallo() {\n echo 'Hallo Welt';\n}\n";
$neuerCode = "<?php\nfunction hallo(string $name = 'Welt') {\n echo 'Hallo ' . $name;\n}\n";
$diff = xdiff_string_diff($altCode, $neuerCode, 2, true);
if ($diff !== false) {
// Diff z. B. in Datenbank speichern oder anzeigen
header('Content-Type: text/plain');
echo $diff;
} else {
echo "Keine Änderungen festgestellt.";
}
// Wichtig · Fallstricke
Voraussetzung: Die Funktion steht nur zur Verfügung, wenn die PECL-Erweiterung xdiff installiert und aktiviert ist (pecl install xdiff). Sie ist kein fester Bestandteil von PHP und muss separat eingebunden werden.
Gibt die Funktion false zurück, sollte geprüft werden, ob die Eingaben tatsächlich unterschiedlich sind – identische Strings führen zu false oder einem leeren Diff, nicht zu einem Fehler. Eine explizite Prüfung mit === false ist empfohlen.
Für das Verarbeiten von Dateien statt Strings empfiehlt sich xdiff_file_diff. Das erzeugte Diff kann mit xdiff_string_patch auf einen anderen String angewendet werden.