Comment masquer un message particulier avec PHP "preg_replace" ou un code plus court?
Je veux afficher les 5 premiers et les 5 derniers chiffres après pub-
du texte spécifié. La chaîne commence toujours par pub-
et il y a toujours 16 nombres dans la séquence . Seuls les chiffres changent. Je souhaite remplacer les 6 chiffres du milieu par des astérisques.
pub-97527******89258
RÉSULTAT:
$string = "pub-9752787982789258"; echo "pub-" . substr(explode("-", $string)[1], 0, 5) . '******' . substr(explode("-", $string)[1], 11, 5);
4 Réponses :
Si vous devez masquer la sous-chaîne au milieu uniquement dans les chaînes qui correspondent au format spécifique , vous pouvez utiliser
preg_replace('~(?:\G(?!^)|^pub-\d{5}(?=\d*$))\K\d(?=\d{5})~', '*', $string)
Voir le Démo PHP et une démo regex .
Détails
(?: \ G (?! ^) | ^ pub- \ d {5} (? = \ d * $))
- fin de la précédente correspondance réussie ou pub -
au début de la chaîne, puis 5 chiffres suivis de 0+ chiffres jusqu'à la fin de la chaîne, puis \ K
- omet le texte correspondant jusqu'à présent \ d
- correspond à n'importe quel chiffre (? = \ d {5})
- s'assure qu'il y a cinq chiffres sur la droite. Avez-vous essayé ce type d'approche:
echo substr_replace($string, '******', 9, strlen($string) -14 );
Étant donné que la largeur de la chaîne est fixe, je pourrais suggérer d'éviter l'expression régulière ici et d'utiliser à la place les fonctions de chaîne de base:
$string = "pub-1885335825402893"; $output = substr($string, 0, 9) . "******" . substr($string, 15, 5); echo $output; pub-18853******02893
Comme l'entrée est strictement formatée et a une longueur statique, il n'y a pas besoin d'un appel regex et cela peut être fait avec un seul appel de fonction (ce qui facilite la lecture et la maintenance et est plus efficace).
Count à la bonne position dans le, soit de l'avant avec un entier positif, soit de l'arrière avec un entier négatif, puis définissez la longueur de remplacement égale au nombre d'astérisques.
Mon preg_replace () L'appel
est la technique la plus longue et la moins efficace. Il consomme et oublie les 5 premiers chiffres, puis remplace les 6 chiffres suivants.
Pour effectuer des remplacements individuels, les deux dernières techniques (regex avec \ G
continuent métacaractère ou pour la boucle
) fera le travail. Le regex sera encore moins efficace que le regex antérieur. La boucle for ()
peut être compétitive rapide, mais je ne vois pas vraiment l'avantage de faire 6 remplacements séparés pour votre scénario.
Code: ( Démo )
pub-18853******02893 --- pub-18853******02893 --- pub-18853******02893 --- pub-18853******02893 --- pub-18853******02893 --- pub-18853******02893 --- pub-18853******02893
Sortie:
$string = "pub-1885335825402893"; echo substr_replace($string, '******', -11, 6); echo "\n---\n"; echo substr_replace($string, '******', -11, -5); echo "\n---\n"; echo substr_replace($string, '******', 9, 6); echo "\n---\n"; echo substr_replace($string, '******', 9, -5); echo "\n---\n"; echo preg_replace('~\d{5}\K\d{6}~', '******', $string); echo "\n---\n"; echo preg_replace('~(?:\G(?!^)|^pub-\d{5})\K\d(?=\d{5})~', '*', $string); echo "\n---\n"; for ($offset = 9; $offset <= 14; ++$offset) { $string[$offset] = '*'; } echo $string;
Notez que sans un lookahead (? = \ D + $)
dans la partie ^ pub- \ d {5}
, '~ (?: \ G (? ! ^) | ^ pub- \ d {5}) \ K \ d (? = \ d {5}) ~ '
n'a pas de sens car il ne vérifie pas le format de la chaîne et n'est pas meilleur qu'un approche non-regex. Ma réponse contient la solution regex qui effectue en fait à la fois la validation et le remplacement si la validation réussit.
L'OP indique clairement que la validation n'est pas nécessaire puisque la chaîne d'entrée est strictement formatée. Je respecte ce que fait votre extrait, je pense simplement que ce n'est pas nécessaire pour la tâche qui est présentée.
Donc, la chaîne doit commencer par
pub-
et n'a alors que des chiffres, non?@ WiktorStribiżew oui, c'est vrai. Cela commence toujours par pub-. et il y a 16 numéros dans la suite. Seuls les chiffres changent.