Aktueller Standort: Startseite> Neueste Artikel> Beispiel für einen Fehler in der Rückruffunktion, um $ Matches zu ändern

Beispiel für einen Fehler in der Rückruffunktion, um $ Matches zu ändern

M66 2025-06-02

preg_replace_callback_array ist eine sehr leistungsstarke Funktion in PHP. Sie können regelmäßige Ausdrücke und Rückruffunktionen eines Arrays abbilden und die Rückruffunktionen flexibler steuern, wenn Sie Strings ersetzen. Trotzdem können Entwickler manchmal versehentlich das $ Matches -Array ändern, wenn sie die Rückruffunktion verwenden, was zu unvorhersehbaren Ergebnissen führt. In diesem Artikel wird angezeigt, wie Sie $ $ Matches in der Callback -Funktion preg_replace_callback_array mit einem Beispiel fälschlicherweise ändern können.

Hintergrund

Die grundlegende Verwendung von preg_replace_callback_array lautet wie folgt:

 preg_replace_callback_array(
    array(
        '/pattern1/' => function($matches) { ... },
        '/pattern2/' => function($matches) { ... },
    ),
    $subject
);

In dieser Funktion ist $ Matches ein Array, das alle vom regulären Ausdruck übereinstimmenden Informationen enthält. In der Rückruffunktion arbeiten Sie normalerweise in diesem Array, um den passenden Inhalt zu verarbeiten.

Fehleränderung $ Matches

Wenn Sie falsch $ übereinstimmen, kann dies zu einem unerwarteten Ersatzverhalten führen, insbesondere wenn Sie die Struktur von $ Matchches in der Rückruffunktion ändern, was sich auf die nachfolgende reguläre Expressionsübereinstimmung auswirken kann. Hier ist ein Beispiel, das zeigt, wie das $ übereinstimmende Array fälschlicherweise geändert wird.

 $pattern = '/(http:\/\/[a-zA-Z0-9.-]+)(\/[a-zA-Z0-9.-]*)/';
$subject = "Visit http://example.com/page1 and http://example.com/page2";

$result = preg_replace_callback_array(
    array(
        $pattern => function($matches) {
            // Fehleränderung$matches
            $matches[1] = "http://m66.net"; // Der Domänenname direkt geändert
            $matches[2] = "/newpage"; // Pfad ändern

            // Kehren Sie zum geänderten Inhalt zurück
            return $matches[1] . $matches[2];
        }
    ),
    $subject
);

echo $result;

Im obigen Code haben wir das erste Element (Domänenname -Teil) und das zweite Element (Pfadteil) im $ übereinstimmenden Array geändert. Dies ist ein falscher Ansatz, da in einigen Fällen die Struktur des $ Matches -Arrays versehentlich geändert werden kann, was zu nachfolgenden Übereinstimmungen führt oder das Ergebnis nicht wie erwartet ist.

Problemanalyse

In preg_replace_callback_array repräsentiert jedes Element des $ Matches -Array eine Übereinstimmung im regulären Ausdruck. Wenn wir eines der Elemente falsch ändern, kann es dazu führen, dass andere Teile des regulären Ausdrucks nicht richtig übereinstimmen. Nach dem Ändern des Domänennamens oder des Pfadteils wird beispielsweise die ursprüngliche Struktur geändert, was dazu führen kann, dass die nicht in der Lage ist, andere verwandte Inhalte korrekt zu ersetzen.

Um dieses Problem zu vermeiden, sollten Sie es vermeiden, das Array $ Matches direkt zu ändern, sondern den ursprünglichen Inhalt durch Erstellen einer neuen Zeichenfolge ersetzen.

Die richtige Art, es zu tun

Um zu vermeiden, dass $ Matches versehentlich geändert werden, sollten wir es durch den Rückgabewert der Rückruffunktion ersetzen, anstatt $ übereinstimmende Übereinstimmungen direkt zu ändern. Hier ist der richtige Code nach der Änderung:

 $pattern = '/(http:\/\/[a-zA-Z0-9.-]+)(\/[a-zA-Z0-9.-]*)/';
$subject = "Visit http://example.com/page1 and http://example.com/page2";

$result = preg_replace_callback_array(
    array(
        $pattern => function($matches) {
            // Erstellen Sie neue Domainnamen und Pfade
            $newUrl = "http://m66.net" . $matches[2]; // Ändern Sie den Domänennamen,Aber behalte den Weg

            // Kehre zu neu zurückURL
            return $newUrl;
        }
    ),
    $subject
);

echo $result;

In diesem Beispiel vermeiden wir es, das $ Matches -Array direkt zu ändern, ersetzen jedoch die ursprüngliche URL, indem wir eine neue Zeichenfolge erstellen. Dies stellt sicher, dass die Rückruffunktion die übereinstimmende Logik des regulären Ausdrucks nicht beeinflusst und auch eine korrekte Substitution erreichen kann.

abschließend

In PREG_REPLACE_CALLBACK_Array kann das fälschliche Ändern von $ -Matches zu unerwarteten Ergebnissen führen. Der beste Weg, dies zu tun, besteht darin, die direkte Änderung von $ Matches zu vermeiden, aber den Ersatz durch Erstellen einer neuen Zeichenfolge abzuschließen. Auf diese Weise können wir sicherstellen, dass die reguläre Ausdrucksübereinstimmung nicht unterbrochen ist, wodurch das richtige Ergebnis erzielt wird.