Dans PHP, MB_EREGI_REPLACE est une fonction de remplacement régulière pour les chaînes de multicette et prend en charge l'appariement insensible à la casse. Il est basé sur la syntaxe d'expression régulière POSIX et ne prend donc pas en charge le groupe nommé comme PCRE (fonctions Preg_ * série). Le regroupement nommé permet des noms significatifs pour certaines parties d'expressions régulières afin de faciliter la maintenance et la lecture du code.
Cet article présentera comment simuler l'effet du regroupement nommé bien que MB_ERGI_REPLACE ne soutient pas nativement le groupe nommé, mais certaines solutions de contournement peuvent être utilisées pour simuler l'effet du groupe nommé.
La syntaxe régulière utilisée par MB_EREGI_REPLACE ne prend pas en charge les groupes nommés de style PCRE, tels que (? <name> modèle) , et il ne prend pas en charge les identificateurs de groupement autres que les nombres.
Exemple:
$pattern = '([a-z]+)'; // Groupement normal
Mais il ne peut pas être écrit comme:
$pattern = '(?<word>[a-z]+)'; // Le groupe nommé n'est pas pris en charge
Par conséquent, si vous avez besoin de référencer le contenu d'un certain groupe, vous ne pouvez l'indexer que par des index numériques, tels que \ 1 , \ 2 , etc.
Bien que MB_ERGI_REPLACE ne puisse pas utiliser directement le groupe nommé, nous pouvons le simuler en combinaison avec des fonctions de rappel pendant le regroupement et le remplacement.
Cependant, MB_EREGI_REPLACE lui-même n'a pas de version de rappel. Nous pouvons d'abord utiliser les fonctions MB_EREG_SEARCH pour correspondre, capturer le contenu de regroupement, puis implémenter la logique de remplacement dans PHP.
Exemple de flux:
Utilisez MB_ERG_SEARCH_INIT et MB_ERG_SEARCH pour correspondre à la chaîne un par un.
Après chaque match, le contenu de regroupement est obtenu et remplacé manuellement.
Utilisez des tableaux PHP pour simuler la structure des groupes nommés.
Le code suivant montre comment utiliser les fonctions de la série MB_ERG_SEARCH pour capturer le contenu de groupement, simuler le regroupement nommé et le remplacement complet:
<?php
// Corde en attente
$text = "User: alice, Email: alice@example.com";
// POSIX Régularité de style,Deux groupes,Nom d'utilisateur et e-mail
$pattern = 'User: ([a-z]+), Email: ([a-z0-9._%-]+@[a-z0-9.-]+\.[a-z]{2,})';
// Initialiser la recherche
mb_ereg_search_init($text, $pattern, 'i'); // iIndique insensible au cas
$result = '';
$offset = 0;
while ($match = mb_ereg_search_pos()) {
// Prenez la position de départ et la longueur du match
list($start, $length) = $match;
// Obtenez la chaîne de correspondance complète
$fullMatch = mb_substr($text, $start, $length);
// Obtenez le contenu du regroupement capturé
$regs = mb_ereg_search_getregs();
// Simuler le groupe nommé
$namedGroups = [
'username' => $regs[1],
'email' => $regs[2],
];
// Gérer la logique de remplacement,Par exemple, capitalisez le nom d'utilisateur,Partie cachée de l'e-mail
$replacement = "User: " . strtoupper($namedGroups['username']) . ", Email: " . maskEmail($namedGroups['email']);
// Résultats de l'épissage
$result .= mb_substr($text, $offset, $start - $offset) . $replacement;
$offset = $start + $length;
// Continuer la recherche
mb_ereg_search_setpos($offset);
}
// Épisser les pièces restantes
$result .= mb_substr($text, $offset);
echo $result;
// Fonctions d'assistance,Masquer la section des e-mails
function maskEmail($email) {
$parts = explode('@', $email);
$name = $parts[0];
$domain = $parts[1];
$maskedName = substr($name, 0, 1) . str_repeat('*', max(0, strlen($name) - 2)) . substr($name, -1);
return $maskedName . '@' . $domain;
}
?>
Étant donné que MB_ERGI_REPLACE ne peut pas utiliser les rappels directement, nous utilisons MB_ERG_SEARCH_INIT et les fonctions connexes pour atteindre la correspondance en boucle et gérer manuellement le remplacement.
Utilisez le tableau $ Regs pour capturer le contenu de regroupement, simulez "le groupe nommé" via les noms de clés du tableau pour rendre le code plus clair.
Le processus de remplacement est entièrement géré dans le code PHP et peut implémenter une logique complexe arbitraire.
Dans l'exemple, la capitalisation du nom d'utilisateur et la cachette de certains caractères dans la boîte aux lettres sont implémentés.
Bien que la fonction MB_EREG_REPLACE elle-même ne prenne pas en charge le groupe nommé, via les fonctions MB_ERG_SEARCH série combinées avec le traitement du code PHP, nous pouvons réaliser des effets de regroupement nommés similaires, améliorer la lisibilité du code et la maintenance.
Si vous avez besoin de fonctionnalités régulières plus complexes et de support de regroupement nommé, il est recommandé d'utiliser preg_replace_callback , mais il ne prend pas en charge le codage multilingue aussi fort que la famille MB_EREG .