Start · Sprachen · PHP · Referenz · xdiff_string_patch

xdiff_string_patch

Funktion

Wendet einen Unified-Diff-Patch auf einen String an und gibt den gepatchten String zurück.

seit PHP 5.2.0 Kategorie: misc

Signatur

xdiff_string_patch(string $str, string $patch, int $flags = XDIFF_PATCH_NORMAL, string &$error = null): string|false

Beschreibung

xdiff_string_patch() wendet einen zuvor erstellten Unified-Diff-Patch (z. B. durch xdiff_string_diff()) auf den übergebenen Original-String an und liefert den gepatchten String zurück. Die Funktion ist der String-Pendant zu xdiff_file_patch(), arbeitet also komplett im Arbeitsspeicher, ohne Dateizugriffe.

Typische Einsatzgebiete sind Versionsverwaltungssysteme, Content-Management-Systeme oder Synchronisierungs-Szenarien, bei denen Textänderungen kompakt als Patch gespeichert und später angewendet werden sollen, ohne temporäre Dateien anlegen zu müssen.

Über den Parameter flags lässt sich steuern, ob der Patch normal (vorwärts) oder in umgekehrter Richtung (rückwärts, d. h. Rückgängigmachen) angewendet werden soll. Abgelehnte Patch-Hunks werden optional über den Referenz-Parameter error zurückgegeben, sodass Teilfehler erkennbar sind.

Hinweis: Diese Funktion erfordert die PECL-Erweiterung xdiff, die in der Standardinstallation von PHP nicht enthalten ist und separat installiert werden muss.

Parameter

Name Typ Default Beschreibung
$str Pflicht string Der Original-String, auf den der Patch angewendet werden soll.
$patch Pflicht string Der Unified-Diff-Patch als String, typischerweise erzeugt durch xdiff_string_diff().
$flags int XDIFF_PATCH_NORMAL Steuert die Patch-Richtung. XDIFF_PATCH_NORMAL (Standardwert) wendet den Patch vorwärts an, XDIFF_PATCH_REVERSE macht den Patch rückgängig.
$error string Optionaler Referenz-Parameter, der nach dem Aufruf alle abgelehnten Patch-Hunks enthält, die nicht angewendet werden konnten.

Rückgabewert

Typ
string|false
Beschreibung
Gibt den gepatchten String zurück. Bei einem vollständigen Fehler wird false zurückgegeben. Teilweise abgelehnte Hunks führen nicht zwingend zu false, sondern werden im error-Parameter gemeldet.

Beispiele

Patch auf einen String anwenden

<?php
// Voraussetzung: PECL-Erweiterung xdiff ist installiert

$original = "Zeile 1\nZeile 2\nZeile 3\n";
$geaendert = "Zeile 1\nZeile 2 – geändert\nZeile 3\n";

// Diff erzeugen
$patch = xdiff_string_diff($original, $geaendert);
echo "Patch:\n" . $patch . "\n";

// Patch anwenden
$ergebnis = xdiff_string_patch($original, $patch);

if ($ergebnis !== false) {
    echo "Gepatchter String:\n" . $ergebnis;
} else {
    echo "Patch konnte nicht angewendet werden.";
}
Patch: --- - 2024-01-01 00:00:00.000000000 +0000 +++ + 2024-01-01 00:00:00.000000000 +0000 @@ -1,3 +1,3 @@ Zeile 1 -Zeile 2 +Zeile 2 – geändert Zeile 3 Gepatchter String: Zeile 1 Zeile 2 – geändert Zeile 3

Patch rückgängig machen mit XDIFF_PATCH_REVERSE

<?php
$original = "Zeile 1\nZeile 2\nZeile 3\n";
$geaendert = "Zeile 1\nZeile 2 – geändert\nZeile 3\n";

$patch = xdiff_string_diff($original, $geaendert);

// Patch erst vorwärts anwenden
$gepatchter_string = xdiff_string_patch($original, $patch);
echo "Nach Patch:\n" . $gepatchter_string . "\n";

// Patch rückwärts anwenden (Änderung rückgängig machen)
$fehler = '';
$zurueck = xdiff_string_patch($gepatchter_string, $patch, XDIFF_PATCH_REVERSE, $fehler);

if ($zurueck !== false) {
    echo "Rückgängig gemacht:\n" . $zurueck;
}

if (!empty($fehler)) {
    echo "Abgelehnte Hunks:\n" . $fehler;
}
Nach Patch: Zeile 1 Zeile 2 – geändert Zeile 3 Rückgängig gemacht: Zeile 1 Zeile 2 Zeile 3

// Wichtig · Fallstricke

Erweiterung erforderlich: xdiff_string_patch() ist Teil der PECL-Erweiterung xdiff und steht nicht in einer Standard-PHP-Installation zur Verfügung. Die Erweiterung muss über PECL oder den Paketmanager des Betriebssystems installiert werden (pecl install xdiff).

Werden Patches auf Benutzereingaben angewendet, sollten diese zuvor sorgfältig validiert werden, da ein manipulierter Patch im Kontext der Anwendung unerwünschte Textmanipulationen verursachen könnte.

Für sehr große Strings oder Binärdaten sind die dateibasierten Pendants xdiff_file_patch() und xdiff_file_bdiff() vorzuziehen, da sie den Arbeitsspeicher schonen.