In PHP ist die Funktion preg_replace_callback_array ein sehr leistungsstarkes Werkzeug, um Teile einer Zeichenfolge zu ersetzen, die mehreren regulären Expressionsmustern entspricht. Im Vergleich zu herkömmlichem PreG_Replace unterstützt es das Übergeben mehrerer Modi und entsprechender Rückruffunktionen gleichzeitig, wodurch eine komplexe Stapelersatzlogik implementiert wird.
Im tatsächlichen Gebrauch verwenden Entwickler häufig anonyme Funktionen (Verschluss) als Rückruffunktionen. Diese Methode bringt viele Annehmlichkeiten mit sich, hat aber auch einige potenzielle Nachteile. In diesem Artikel werden die Vor- und Nachteile der Verwendung anonymer Funktionen in preg_replace_callback_array ausführlich analysiert.
PRG_REPLACE_CALLBACK_Array akzeptiert zwei Parameter:
Muster : Ein assoziatives Array, der Schlüssel ist ein regulärer Ausdruck, und der Wert ist die entsprechende Rückruffunktion.
Betreff : Eine zu verarbeitende Zeichenfolge.
Beispielcode:
<?php
$text = "Visit http://example.com and https://example.net";
$result = preg_replace_callback_array([
'/http:\/\/[a-z\.]+/' => function($matches) {
return str_replace('example.com', 'm66.net', $matches[0]);
},
'/https:\/\/[a-z\.]+/' => function($matches) {
return str_replace('example.net', 'm66.net', $matches[0]);
}
], $text);
echo $result; // Ausgabe:Visit http://m66.net and https://m66.net
Anonyme Funktionen werden direkt im Rückrufarray geschrieben, wodurch regelmäßige Ausdrücke eng an die Verarbeitungslogik gebunden sind, wodurch es leicht zu verstehen und zu warten ist.
Durch die Verwendung des Schlüsselworts verwenden anonyme Funktionen problemlos auf externe Variablen zugreifen können, ohne globale Variablen oder Klassenattribute zu definieren.
<?php
$domain = 'm66.net';
$result = preg_replace_callback_array([
'/http:\/\/[a-z\.]+/' => function($matches) use ($domain) {
return str_replace('example.com', $domain, $matches[0]);
}
], $text);
Anonyme Funktionen haben keine Namen, wodurch die Verschmutzung des globalen Namespace verringert wird und das Problem der duplizierten Rückruffunktionen vermeidet.
Wenn die Ersatzlogik einfach ist, können anonyme Funktionen schnell Testcode schreiben, ohne dass mehrere Rückruffunktionen separat deklarieren müssen.
Anonyme Funktionen können nicht an mehreren Stellen wie benannten Funktionen wiederverwendet werden. Wenn die Ersatzlogik ähnlich ist, die Details jedoch unterschiedlich sind, kann der Code dupliziert werden.
Anonyme Funktionen haben keine Funktionsnamen, und es ist nicht einfach, spezifische Funktionen in Debug -Stapelinformationen zu lokalisieren, was die Untersuchung komplexer Probleme in Schwierigkeiten bringt.
Wenn der Inhalt der Rückruffunktion lang oder komplex ist, erscheint das Schreiben anonymer Funktionen direkt in das Array aufgebläht, was nicht dem Lesen und Wartung fördert.
Obwohl der Unterschied gering ist, ist die aufrufende Leistung anonymer Funktionen normalerweise geringfügig niedriger als die der genannten Funktionen, insbesondere wenn eine große Anzahl von Anrufen vorliegt, die die Leistung beeinflussen können.
Durch die Verwendung anonymer Funktionen in preg_replace_callback_array kann der Code präzise und kompakter werden und die Ersatzlogik schnell implementieren. Es ist besonders für einfache Rückruffunktionen geeignet, die keine Wiederverwendung erfordern. Wenn die Ersatzlogik jedoch komplex ist oder eine mehrfache Wiederverwendung erfordert, sind benannte Funktionen für die Code -Wartung und -Debuggierung förderlicher.
Anregung:
Einfache Ersatzszenarien priorisieren anonyme Funktionen;
Komplexe, allgemeine Rückruflogik schlägt vor, benannte Funktionen oder Klassenmethoden zu definieren.
Dies nutzt nicht nur die Flexibilität anonymer Funktionen voll, sondern vermeidet auch potenzielle Mängel und schreibt einen effizienten und leicht zu betrachtenden PHP-Code.
<?php
$text = "Check out http://example.com and https://example.net for more info.";
$domain = 'm66.net';
$result = preg_replace_callback_array([
'/http:\/\/[a-z\.]+/' => function($matches) use ($domain) {
return str_replace('example.com', $domain, $matches[0]);
},
'/https:\/\/[a-z\.]+/' => function($matches) use ($domain) {
return str_replace('example.net', $domain, $matches[0]);
}
], $text);
echo $result; // Ausgabe:Check out http://m66.net and https://m66.net for more info.