将所有字符替换为*,但指定的字符除外

时间:2017-06-01 09:35:32

标签: php

我需要在查看某个页面时审查电子邮件地址,以便第一个字母可见且@符号可见,但其余部分使用*进行审查,如下例所示:

v ******** ********* @

我该怎么做呢?我找不到任何答案(或者我可能不是谷歌搜索正确的东西)。

4 个答案:

答案 0 :(得分:4)

短而甜的单线:

$result = substr($str, 0, 1) . preg_replace('/[^@]/', '*', substr($str, 1));
  1. substr($str, 0, 1)获取字符串的第一个字符,例如v
  2. preg_replace('/[^@]/', '*', substr($str, 1))会替换第一个字符以后的所有内容,而不是@符号。
  3. eval.in演示。

答案 1 :(得分:0)

<?php

$email = "vmail@vmail.com";

// Split into name and domain
$pieces = explode("@", $email);

// Add the first letter
$censored = substr($email, 0, 1);

// Add the name stars
for ($i = 1; $i <= strlen($pieces[0]) - 1; $i++) {
    $censored = $censored."*";
}

// Add the @ sign
$censored = $censored."@";

// Add the domain stars
for ($i = 1; $i <= strlen($pieces[1]); $i++) {
    $censored = $censored."*";
}

echo $censored;

答案 2 :(得分:0)

使用正则表达式和str_pad?
使用正则表达式捕获第一个字母,然后将其余部分分成几部分 使用str_pad在字符串中添加“*”。

https://3v4l.org/dvYpT

$mail = "Test@test.com";

preg_match("/(.)(.*?)@(.*)/", $mail, $Match);

$str = $Match[1] . str_pad("", strlen($Match[2]), "*"). "@" . str_pad("", strlen($Match[3]), "*");
echo $str;

答案 3 :(得分:0)

使用重新组合字符串的回调:

<?php
$subject = 'someone@example.com';
$subject = preg_replace_callback('/^(.)(.*)@(.*)$/', function($m) {
  return sprintf(
    '%s%s@%s',
    $m[1],
    str_pad('', strlen($m[2]), '*'),
    str_pad('', strlen($m[3]), '*')
  );
}, $subject);
var_dump($subject);

输出显然是:

string(19) "s******@***********"