1
votes

Comment masquer un article particulier avec "preg_replace" ou un code plus court?

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);


2 commentaires

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.


4 Réponses :


1
votes

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.


0 commentaires

1
votes

Avez-vous essayé ce type d'approche:

echo substr_replace($string, '******', 9, strlen($string) -14 );


0 commentaires

1
votes

É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


0 commentaires

1
votes

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;


2 commentaires

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.