Replacing every number in a string with a random char

ぃ、小莉子 提交于 2021-01-28 07:36:34

问题


I want to replace every number in a string like ABC123EFG with another random char.
My idea was to generate a random string with the number of all numbers in $str and replace every digit by $array[count_of_the_digit], is there any way to do this without a for-loop, for example with regex?

$count = preg_match_all('/[0-9]/', $str);
$randString = substr(str_shuffle(str_repeat("abcdefghijklmnopqrstuvwxyz", $count)), 0, $count);
$randString = str_split($randString);
$str = preg_replace('/[0-9]+/', $randString[${n}], $str); // Kinda like this (obviously doesnt work)

回答1:


You could use preg_replace_callback()

$str = 'ABC123EFG';

echo preg_replace_callback('/\d/', function(){
  return chr(mt_rand(97, 122));
}, $str);

It would output something like:

ABCcbrEFG

If you want upper case values, you can change 97 and 122 to their ASCII equivalent of 64 to 90.




回答2:


You can use preg_replace_callback to call a function where the returned value is the replacement. Here is an example that does what you want:

<?php
function preg_replace_random_array($string, $pattern, $replace){
    //perform replacement
    $string = preg_replace_callback($pattern, function($m) use ($replace){
            //return a random value from $replace
            return $replace[array_rand($replace)];
        }, $string);

    return $string;
}

$string = 'test123asdf';

//I pass in a pattern so this can be used for anything, not just numbers.
$pattern = '/\d/';
//I pass in an array, not a string, so that the replacement doesn't have to
//be a single character. It could be any string/number value including words.
$replace = str_split('ABCDEFGHIJKLMNOPQRSTUVWXYZ');

var_dump(preg_replace_random_array($string, $pattern, $replace));


来源:https://stackoverflow.com/questions/42816112/replacing-every-number-in-a-string-with-a-random-char

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!