PHP регулярное выражение для маскировки нескольких писем - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть электронная почта в этом формате.Я попробовал приведенное ниже регулярное выражение, я не смог замаскировать письмо после точки с запятой.

var email = "testing.123@gmail.com;testing-test2@gmail.com";
a
//using this regex
preg_replace("/(?:(?:^|(?<=@))([^.@])|\G(?!\A))[^.@](?:([^.@])(?=[.@]))?/","$1*$2",email);
a

Вывод будет

t*****g.123@g***l.com;testing-test2@g***l.com

Мой ожидаемый вывод

t*********3@g***l.com;t***********2@g***l.com

Какмогу ли я достичь этого?Или есть более эффективный способ сделать это?Благодаря.

1 Ответ

0 голосов
/ 01 декабря 2018

Вместо того, чтобы пытаться сопоставить два типа подстрок (то есть до @ и после @) по отдельности, вы можете рассмотреть возможность сопоставления обоих сразу и использовать preg_replace_callback заменить промежуточные символы на * s:

$result = preg_replace_callback(
  '/(?:^|(?<=;))([^@])([^@]*)([^@]@[^.])([^.]*)(?=[^.]\.)/',
  function ($matches) {
    return $matches[1] . str_repeat('*', strlen($matches[2])) . $matches[3] . str_repeat('*', strlen($matches[4]));
  },
  $str
);

https://regex101.com/r/VfS4Fh/2

Шаблон

(?:^|(?<=;))([^@])([^@]*)([^@]@[^.])([^.]*)(?=[^.]\.)

означает:

  • (?:^|(?<=;)) - Начать с начала строки или сразу после ;
  • ([^@]) - Первая группа - захватить первый символ
  • ([^@]*) - Второйгруппа - захват не @ символов (замените на * с позже)
  • ([^@]@[^.]) - Третья группа - захват @ и символов на каждой стороне
  • ([^.]*) - Четвертая группа - захват не . символов (замените на * с позже)
  • (?=[^.]\.) - Ожидание не . символа, за которым следует .

Затем замените на те же группы в том же порядке, за исключением того, что вторая и четвертая группы заменены на * s.

...