Dans PHP, la fonction preg_replace_callback_array est un outil très puissant pour remplacer les parties d'une chaîne conforme à plusieurs modèles d'expression réguliers. Par rapport à PREG_REPLACE traditionnel, il prend en charge le passage de plusieurs modes et les fonctions de rappel correspondantes à la fois, implémentant ainsi la logique de remplacement par lots complexe.
Dans une utilisation réelle, les développeurs utilisent souvent des fonctions anonymes (fermeture) comme fonctions de rappel. Cette méthode apporte de nombreuses commodités, mais présente également des inconvénients potentiels. Cet article analysera en détail les avantages et les inconvénients de l'utilisation de fonctions anonymes dans preg_replace_callback_array .
preg_replace_callback_array accepte deux paramètres:
Modèles : un tableau associatif, la clé est une expression régulière et la valeur est la fonction de rappel correspondante.
Sujet : une chaîne à traiter.
Exemple de code:
<?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; // Sortir:Visit http://m66.net and https://m66.net
Les fonctions anonymes sont écrites directement dans le tableau de rappel, ce qui rend les expressions régulières étroitement liées à la logique de traitement, ce qui facilite la compréhension et le maintien.
En utilisant le mot clé Utiliser , les fonctions anonymes peuvent facilement accéder aux variables externes sans définir des variables globales ou des attributs de classe.
<?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);
Les fonctions anonymes n'ont pas de noms, ce qui réduit la pollution de l'espace de noms global et évite le problème des fonctions de rappel dupliquées.
Lorsque la logique de remplacement est simple, les fonctions anonymes peuvent rapidement écrire du code de test sans avoir besoin de déclarer plusieurs fonctions de rappel séparément.
Les fonctions anonymes ne peuvent pas être réutilisées à plusieurs endroits comme les fonctions nommées. Si la logique de remplacement est similaire mais que les détails sont différents, le code peut être dupliqué.
Les fonctions anonymes n'ont pas de noms de fonction, et il n'est pas facile de localiser des fonctions spécifiques dans les informations de pile de débogage, ce qui apporte des problèmes à l'étude de problèmes complexes.
Lorsque le contenu de la fonction de rappel est long ou complexe, l'écriture de fonctions anonymes directement dans le tableau fera apparaître le code, ce qui n'est pas propice à la lecture et à la maintenance.
Bien que la différence soit petite, les performances d'appel des fonctions anonymes sont généralement légèrement inférieures à celles des fonctions nommées, en particulier lorsqu'il existe un grand nombre d'appels, ce qui peut affecter les performances.
L'utilisation de fonctions anonymes dans preg_replace_callback_array peut rendre le code plus concis et compact, et implémenter rapidement la logique de remplacement. Il convient particulièrement aux fonctions de rappel simples qui ne nécessitent pas de réutilisation. Cependant, lorsque la logique de remplacement est complexe ou nécessite une réutilisation multiple, les fonctions nommées seront plus propices à la maintenance et au débogage du code.
suggestion:
Les scénarios de remplacement simples hiérarchisent les fonctions anonymes;
La logique de rappel complexe, suggère de définir des fonctions nommées ou des méthodes de classe.
Cela utilise non seulement pleinement la flexibilité des fonctions anonymes, mais évite également les défauts potentiels et écrit un code PHP efficace et facile à maintenir.
<?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; // Sortir:Check out http://m66.net and https://m66.net for more info.