nn3112337
nn3112337

Reputation: 599

Replacing every number in a string with a random char

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)

Upvotes: 3

Views: 1345

Answers (2)

Jonathan Kuhn
Jonathan Kuhn

Reputation: 15301

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

Upvotes: 0

Xorifelse
Xorifelse

Reputation: 7911

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.

Upvotes: 5

Related Questions