Start · Sprachen · PHP · Referenz · xdiff_string_diff

xdiff_string_diff

Funktion

Erstellt einen Unified Diff zweier Strings und gibt das Diff-Ergebnis als String zurück.

seit PHP 0.2.0 Kategorie: misc

Signatur

xdiff_string_diff(string $old_data, string $new_data, int $context = 3, bool $minimal = false): string|false

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

Typ
string|false
Beschreibung
Gibt einen String mit dem Unified Diff zurück. Falls kein Unterschied besteht oder ein Fehler auftritt, wird 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.";
}
@@ -1,4 +1,4 @@ Zeile 1 -Zeile 2 +Zeile 2 geändert Zeile 3 Zeile 4

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.";
}
@@ -1,4 +1,4 @@ <?php -function hallo() { - echo 'Hallo Welt'; +function hallo(string $name = 'Welt') { + echo 'Hallo ' . $name; }

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