PHP隐藏字符串的一部分

5
我正在寻找在PHP中隐藏字符串(例如用户名)的最优雅的方法。
例如,用户名应显示为:
tim   will be shown as: t*m

因此,用户名本身并不完全“神秘”,但没有人能猜出他们的登录名,或者至少不能确定。

3
这个 j**n 能用于表示 john 吗?我的意思是,很容易猜到 j**njohn,也许你应该考虑这种隐藏的形式,比如 ***n - RomanPerekhrest
@RomanPerekhrest,你为什么说j**njohn而不是jean呢?无论如何,用户名通常不会这么简单。 - Jakub Matczak
@dragoste,因为“John”是更受欢迎的名字,且具有更高的匹配概率,可以与j**n相匹配。 - RomanPerekhrest
但是用户名是唯一的。系统中只会有一个john和一个jean。因此,已经是50/50了。任何其他名为John或Jean的人都需要想出其他用户名,所以它不管有多流行也无关紧要。 - Jakub Matczak
5个回答

9
您可以使用 preg_replace 函数来实现相关功能:
$string = 'usernameTest';
echo preg_replace("/(?!^).(?!$)/", "*", $string); // u**********t
  • (?!^) 检查字符是否不是字符串中的第一个字符。
  • . 匹配任何字符
  • (?!$) 检查字符是否不是字符串中的最后一个字符。

希望这能有所帮助。


这正是我要建议的解决方案。 - Ben Hillier

4
您可以使用以下正则表达式preg_replace函数一起使用,例如:
(^.|.$)(*SKIP)(*F)|(.)

例子

$your_string = "Narendra";
echo preg_replace("/(^.|.$)(*SKIP)(*F)|(.)/","*",$your_string);

输出:

N******a

正则表达式的解释:

  • (^.|.$) 这个将会捕获单词的第一个和最后一个字母
  • (*SKIP)(*F) 这个将会跳过上面捕获到的单词
  • |(.) 在这里,其余的字母将被捕获并可以进一步用您的字符替换,例如在此处使用*

演示


1

尝试:

function get_starred($str) {
    $len = strlen($str);
    return substr($str, 0, 1).str_repeat('*', $len - 2).substr($str, $len - 1, 1);
}


$myStr = 'YourName';
echo get_starred($myStr); //should show Y******e 

0
你可以像这样做,例如:
<?php
function HideUN($username = "") {
    $replaced = "";

    # Count the characters in username and remove an extra asterik (*)
    # Substring, remove all characters and leave the first one and add the last one
    for($i = 0; $i < strlen($username) -1; $i++) $replaced .= "*";

    return substr($username, 0, 1)."".$replaced."".substr($username, -1, 1);
}
# Call this function
$string = "John";
echo HideUN($string);
?>

substr()函数会将第一个字符后的所有字符删除,然后使用for()循环来计算$string中的字符数, 并将星号(*)添加到另一个变量$replaced中。

最后,将它们一起放在echo语句中输出:J***n


0
function Split_Hide_Name($name) {
$name = trim($name);
$split_name = explode(' ',$name);
foreach($split_name as $v) {
   $string []= strlen($v);
}
$number_of_letters_to_show = 3;
$first_name_length = $string[0];
$last_name_length = $string[count($string)-1];

$first_name1 = $split_name[0];
$last_name1 = $split_name[count($string)-1];

$fname_cover = '';
for ($i = 0; $i < $first_name_length - $number_of_letters_to_show; $i++){
$fname_cover .="*";
}

$lname_cover = '';
for ($i = 0; $i < $last_name_length - $number_of_letters_to_show; $i++){
$lname_cover .="*";
}

$first_name = substr_replace($first_name1,$fname_cover,$number_of_letters_to_show);
$last_name = substr_replace($last_name1,$lname_cover,$number_of_letters_to_show);

return $first_name.' '.$last_name;}

虽然这段代码可能回答了问题,但是提供关于为什么和/或如何回答问题的额外上下文可以提高其长期价值。 - β.εηοιτ.βε

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接