Beim Umgang mit String -Austausch bietet PHP mehrere leistungsstarke Tools, darunter preg_replace_callback eine weit verbreitete Funktion, mit der wir die Übereinstimmungsergebnisse mit regulären Ausdrücken zurückrufen können. Seit PHP 7 wurde jedoch eine leistungsstärkere Funktion eingeführt: preg_replace_callback_array , das nicht nur ähnliche Aufgaben ausführt, sondern uns auch mehr Flexibilität und Lesbarkeit bringt.
In diesem Artikel wird eingehalten, wie diese beiden Funktionen verwendet werden, und ihre jeweiligen Vorteile durch den Vergleich von Beispielen und untersuchen, warum preg_replace_callback_array eine elegantere Wahl ist, wenn es sich um Multi-Muster-Matching handelt.
preg_replace_callback empfängt ein reguläres Musterarray und eine Rückruffunktion und verarbeitet alle Übereinstimmungen mit demselben Rückruf.
Beispiel:
$pattern = ['/foo/', '/bar/'];
$callback = function ($matches) {
return strtoupper($matches[0]);
};
$text = "foo and bar";
$result = preg_replace_callback($pattern, $callback, $text);
// Ergebnis: "FOO and BAR"
Das Problem ist, dass verschiedene Modi dieselbe Rückruffunktion verwenden, um die Logik zu verarbeiten , und für komplexe Übereinstimmungen wird der Code aufgebläht und unklar.
Preg_Replace_Callback_Array ermöglicht es uns , verschiedene Rückruffunktionen für verschiedene reguläre Modi anzugeben und so eine größere Flexibilität und Lesbarkeit zu erreichen.
preg_replace_callback_array(array $patterns_and_callbacks, string $subject)
Beispiel:
$text = "Visit http://m66.net or send mail to info@m66.net";
$result = preg_replace_callback_array([
// ersetzenURL
'~https?://[^\s]+~' => function ($matches) {
return '<a href="' . $matches[0] . '">' . $matches[0] . '</a>';
},
// ersetzenEmail
'/[\w\.-]+@[\w\.-]+\.\w+/' => function ($matches) {
return '<a href="mailto:' . $matches[0] . '">' . $matches[0] . '</a>';
},
], $text);
// Ergebnis: 'Visit <a href="http://m66.net">http://m66.net</a> or send mail to <a href="mailto:info@m66.net">info@m66.net</a>'
Durch die Angabe einer klaren Rückruffunktion für jedes Muster kann die Codelogik klarer sein und müssen nicht mehr verwendet, wenn/sonst in derselben Funktion, welches Übereinstimmungsmuster ist.
Sie können für jedes Matching -Muster eine völlig andere Verarbeitungslogik bereitstellen, z. B. eine für die Verknüpfung mit HTML und die andere zur sensiblen Wortsubstitution, die sich nicht stört.
Da jedes Muster an den entsprechenden Rückruf gebunden ist, vermeidet es logische Verwirrung oder Misshandlung, die auftreten kann, wenn mehrere Muster eine Funktion teilen.
preg_replace_callback_array führt Ersatzvorgänge in Array -Reihenfolge durch. Dies bedeutet, dass Sie die Priorität steuern können - einige Ersatzvorgänge vor anderen Modi ausführen.
$text = "Bitte besuchen Sie http://m66.net,Oder Kontakt admin@m66.net,oder @john Erfahren Sie mehr。";
$result = preg_replace_callback_array([
// URL
'~https?://[^\s]+~' => function ($matches) {
return '<a href="' . $matches[0] . '">' . $matches[0] . '</a>';
},
// Email
'/[\w\.-]+@[\w\.-]+\.\w+/' => function ($matches) {
return '<a href="mailto:' . $matches[0] . '">' . $matches[0] . '</a>';
},
// @Benutzer
'/@(\w+)/' => function ($matches) {
return '<a href="http://m66.net/user/' . $matches[1] . '">@' . $matches[1] . '</a>';
},
], $text);
Das Ergebnis wird eine reichhaltige Textausgabe, geeignet für Foren, Kommentarebereiche, Chat -Systeme usw.
preg_replace_callback_array wurde in PHP 7.0 eingeführt und kann nicht verwendet werden, wenn Sie in älteren Versionen ausführen (z. B. PHP 5.6).
Wenn Sie Unterstützung für ältere Versionen von PHP beibehalten möchten, können Sie nur die herkömmliche preg_replace_callback verwenden.
preg_replace_callback_array bringt uns eine elegantere reguläre Ersatzlösung, insbesondere wenn mehrere Modi eine unterschiedliche Verarbeitungslogik erfordern. Wenn Ihr Projekt bereits in PHP 7.0 oder höher ausgeführt wird, wird dringend empfohlen, die ursprüngliche Multi-Mode-Verarbeitungslogik basierend auf PRG_REPLACE_CALLBACK zu migrieren, was nicht nur die Code-Lesbarkeit verbessert, sondern auch die Wartung erleichtert.
Die zukünftige PHP -Entwicklung ist nicht mehr nur "nur" nur "benutzt", aber sie sollte elegant, klar und leicht zu pflegen geschrieben werden.