Lorsque vous traitez avec le remplacement des chaînes, PHP fournit plusieurs outils puissants, parmi lesquels Preg_replace_Callback est une fonction largement utilisée qui nous permet de rappeler les résultats correspondants à l'aide d'expressions régulières. Cependant, depuis PHP 7, une fonction plus puissante a été introduite: preg_replace_callback_array , qui non seulement effectue des tâches similaires, mais nous apporte également une plus grande flexibilité et lisibilité.
Cet article expliquera en profondeur comment ces deux fonctions sont utilisées et leurs avantages respectifs en comparant des exemples et explorer pourquoi preg_replace_callback_array est un choix plus élégant lorsqu'il s'agit de l'appariement multi-motifs.
preg_replace_callback reçoit un tableau de motif régulier et une fonction de rappel, et traite toutes les correspondances en utilisant le même rappel.
Exemple:
$pattern = ['/foo/', '/bar/'];
$callback = function ($matches) {
return strtoupper($matches[0]);
};
$text = "foo and bar";
$result = preg_replace_callback($pattern, $callback, $text);
// résultat: "FOO and BAR"
Le problème est que différents modes utilisent la même fonction de rappel pour traiter la logique , et pour les correspondances complexes, le code deviendra gonflé et peu clair.
preg_replace_callback_array nous permet de spécifier différentes fonctions de rappel pour différents modes réguliers , réalisant ainsi une plus grande flexibilité et lisibilité.
preg_replace_callback_array(array $patterns_and_callbacks, string $subject)
Exemple:
$text = "Visit http://m66.net or send mail to info@m66.net";
$result = preg_replace_callback_array([
// remplacerURL
'~https?://[^\s]+~' => function ($matches) {
return '<a href="' . $matches[0] . '">' . $matches[0] . '</a>';
},
// remplacerEmail
'/[\w\.-]+@[\w\.-]+\.\w+/' => function ($matches) {
return '<a href="mailto:' . $matches[0] . '">' . $matches[0] . '</a>';
},
], $text);
// résultat: 'Visit <a href="http://m66.net">http://m66.net</a> or send mail to <a href="mailto:info@m66.net">info@m66.net</a>'
En spécifiant une fonction de rappel claire pour chaque modèle, la logique de code peut être plus claire et n'a plus besoin d'utiliser si / autre dans la même fonction pour déterminer le modèle de correspondance.
Vous pouvez fournir une logique de traitement complètement différente pour chaque modèle de correspondance, comme l'un pour la liaison à HTML, et l'autre pour la substitution sensible des mots, qui n'interfère pas les uns avec les autres.
Étant donné que chaque modèle est lié au rappel correspondant, il évite la confusion logique ou la mauvaise gestion qui peut se produire lorsque plusieurs modèles partagent une fonction.
preg_replace_callback_array effectue des opérations de remplacement dans l'ordre du tableau, ce qui signifie que vous pouvez contrôler la priorité - laissez certaines opérations de remplacement être effectuées avant d'autres modes.
$text = "Veuillez visiter http://m66.net,Ou contact admin@m66.net,ou @john Apprendre encore plus。";
$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>';
},
// @utilisateur
'/@(\w+)/' => function ($matches) {
return '<a href="http://m66.net/user/' . $matches[1] . '">@' . $matches[1] . '</a>';
},
], $text);
Le résultat deviendra une puissance de texte riche, adaptée aux forums, aux zones de commentaires, aux systèmes de chat, etc.
preg_replace_callback_array a été introduit dans PHP 7.0 et ne peut pas être utilisé si vous exécutez dans des versions plus anciennes (comme PHP 5.6).
Si vous souhaitez maintenir la prise en charge des anciennes versions de PHP, vous ne pouvez utiliser que le prég_replace_callback traditionnel.
preg_replace_callback_array nous apporte une solution de remplacement régulière plus élégante, en particulier lorsque plusieurs modes nécessitent une logique de traitement différente. Si votre projet s'exécute déjà dans PHP 7.0 ou version ultérieure, il est fortement recommandé de migrer la logique de traitement multimode d'origine basée sur Preg_replace_Callback , ce qui améliore non seulement la lisibilité du code, mais facilite également la maintenance.
Le futur développement de PHP n'est plus simplement «l'utiliser», mais il doit être écrit avec élégance, claire et facile à entretenir.