In PHP ist die Funktion preg_replace_callback_array ein sehr leistungsstarkes Tool, mit dem mehrere reguläre Ausdrücke und entsprechende Rückruffunktionen kombiniert werden können, um mehrere Ersatzvorgänge gleichzeitig zu verarbeiten. Obwohl es bequem ist, haben Sie manchmal ein Problem, dass regelmäßige Ausdrücke "leeres Match" zurückgeben können. Dies bedeutet, dass der Regex erfolgreich mit etwas übereinstimmt, aber keine tatsächlichen Ersetzungen zurückgibt. In diesem Artikel werden wir untersuchen, warum dies geschieht und wie dieses Problem vermieden werden kann.
preg_replace_callback_array ist eine Funktion in PHP, die ein assoziatives Array als Parameter akzeptiert, dessen Schlüssel reguläre Ausdrücke und Werte entsprechende Rückruffunktionen sind. Die Funktion entspricht dem definierten regulären Ausdruck und verwendet dann die entsprechende Rückruffunktion, um das Matching -Ergebnis zu verarbeiten. Die grundlegende Syntax ist wie folgt:
preg_replace_callback_array(array $patterns_and_callbacks, string $subject);
$ musters_and_callbacks : Dies ist ein assoziatives Array, in dem jeder Schlüssel ein regulärer Ausdruck ist und jeder Wert eine Rückruffunktion ist.
$ Betreff : Die zu verarbeitende Zeichenfolge.
Diese Funktion wird über jeden regulären Ausdruck im Array iteriert und den passenden Inhalt zur Verarbeitung an die Rückruffunktion übergeben.
Das Problem der Nullübereinstimmung hängt normalerweise mit dem Schreiben regulärer Ausdrücke, der Logik der Rückruffunktionen und dem Arbeitsmechanismus von PREG_REPLACE_CALLBACK_Array zusammen. Hier sind einige häufige Gründe:
In regulären Ausdrücken kann ein Nicht-Greedy-Match (wie * oder +?, Usw.) verwendet werden, und kann mit einer leeren Zeichenfolge übereinstimmen. Zum Beispiel:
$patterns = [
'/<a.*?>/' => function($matches) {
return 'Link';
},
];
$text = '<a href="http://m66.net">Click here</a>';
$result = preg_replace_callback_array($patterns, $text);
In diesem Fall entspricht der reguläre Ausdruck <a.*?> Das <a> -Tag übereinstimmt, ist jedoch so kurz wie möglich und verursacht möglicherweise eine Rückgabe einer leeren Übereinstimmung, insbesondere wenn es keinen tatsächlichen Inhalt oder Attribut im <a> Tag gibt. Um dies zu vermeiden, sollten Sie den regulären Ausdruck so ändern, dass Sie das übereinstimmen, was Sie genauer benötigen.
Wenn die Rückruffunktion eine leere Zeichenfolge zurückgibt, ändert sich der Ersatzvorgang trotz des regulären Ausdrucks, der erfolgreich entspricht, nichts. Zum Beispiel:
$patterns = [
'/<a href="http:\/\/m66.net.*?">.*?<\/a>/' => function($matches) {
return ''; // Eine leere Zeichenfolge zurückgeben
},
];
$text = '<a href="http://m66.net">Click here</a>';
$result = preg_replace_callback_array($patterns, $text);
In diesem Beispiel gibt die Rückruffunktion eine leere Zeichenfolge zurück. Selbst wenn der reguläre Ausdruck mit dem <A> -Tag übereinstimmt, wird der Inhalt durch eine leere Zeichenfolge ersetzt, was zu einem scheinbar "leeren Übereinstimmung" führt.
Wenn der Regex zu weitgehend geschrieben ist, kann es zu unnötigen Inhalten übereinstimmen, was zu einer leeren Übereinstimmung führt. Wenn der reguläre Ausdruck beispielsweise zu unscharf ist, kann er mit einigen irrelevanten Nullzeichen oder anderen Inhalten übereinstimmen, was schließlich zur Rückkehrfunktion führt, die einen Nullwert zurückgibt. Um dies zu vermeiden, sollten Sie sicherstellen, dass der reguläre Ausdruck so genau wie möglich ist und die Teile entspricht, die Sie tatsächlich ersetzen müssen.
Bei der Verarbeitung von URLs, insbesondere bei der Verwendung regulärer Ausdrücke, um URLs zu entsprechen, kann es beim Austausch ungenauer Domänenname angepasst werden. Wenn wir beispielsweise einen regulären Ausdruck verwenden, der alle URLs entspricht:
$patterns = [
'/https?:\/\/[a-zA-Z0-9.-]+/' => function($matches) {
// Ersetzen Sie den Domainnamen als m66.net
return str_replace(parse_url($matches[0], PHP_URL_HOST), 'm66.net', $matches[0]);
},
];
$text = 'Visit http://example.com or https://m66.net for more info.';
$result = preg_replace_callback_array($patterns, $text);
Der Zweck dieses Codes besteht darin, den Namen der URL -Domänen im Text durch m66.net zu ersetzen. Wenn der reguläre Ausdruck jedoch nicht mit der URL übereinstimmt oder die URL selbst leer ist oder falsch formatiert ist, kann dies zu einer leeren Übereinstimmung führen.
Um leere Übereinstimmungen zu vermeiden, können wir die folgenden Maßnahmen ergreifen:
Schreiben Sie genau regelmäßige Ausdrücke : Stellen Sie sicher, dass reguläre Ausdrücke genau dem übereinstimmen, was wir ersetzen müssen, und vermeiden Sie es, Nullfiguren oder unerwünschte Inhalte zu entsprechen.
Überprüfen Sie den Rückgabewert der Rückruffunktion : Stellen Sie sicher, dass die Rückruffunktion keine leere Zeichenfolge zurückgibt, es sei denn, dies ist das Verhalten, das Sie erwarten. Wenn Sie eine Übereinstimmung löschen müssen, sollten Sie NULL oder einen geeigneten Ersatzwert anstelle einer leeren Zeichenfolge zurückgeben.
Debuggen Sie regelmäßige Ausdrücke : Sie können den regulären Ausdruck zunächst durch Funktionen wie Preg_match () debuggen, um sicherzustellen, dass er dem entspricht, was Sie erwarten.
Verwenden von gieriger Übereinstimmung : In einigen Fällen kann die Verwendung von Greedy -Matching ( * , + ) effizienter sein, insbesondere wenn sichergestellt wird, dass der gesamte Zielinhalt genau übereinstimmt.
preg_replace_callback_array ist ein leistungsstarkes Tool, das bequeme Ersatzvorgänge ermöglicht. Während des Gebrauchs müssen wir jedoch auf die Gestaltung des regulären Ausdrucks achten, um sicherzustellen, dass er genau dem Inhalt entspricht, der ersetzt werden muss, und gleichzeitig leere Übereinstimmungen zu vermeiden. Durch genaues Schreiben regulärer Ausdrücke, sicherstellen, dass die Rückruffunktion korrekt zurückkehrt und die passende Logik debuggen, kann das leere passende Problem effektiv vermieden werden.
Hoffentlich können Sie durch die Analyse dieses Artikels besser verstehen, warum reguläre Ausdrücke Nullübereinstimmungen verursachen und dieses Problem in der tatsächlichen Entwicklung vermeiden.