用 php 中的随机数字替换字符串中的奇数位置

Replace odd positions in string with a random digit in php

我有一个字符串,我只想用随机数字替换其中的奇数位置。

例如,字符串是'123456'。现在我想要的输出是 '528496'; 注意奇数位的数字1,3,5被随机数字5,8,9代替。

我知道如何使用 PHP 循环来做到这一点,但想知道是否可以使用正则表达式来完成。

我在网上找到了以下两个相关的解决方案,但仍然无法实现。

解决方案 1

echo preg_replace('/(.)./', ' ', $str);

解决方案 2

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

PS:我试图对这些问题发表评论,但由于我的声誉只有 5,所以我无法:(

替换奇数索引处的字符

echo preg_replace_callback('/.(.|$)/', function ($matches) {
    return rand(0, 9) . $matches[1];
}, $str);

替换偶数索引处的字符

echo preg_replace_callback('/(.)./', function ($matches) {
    return $matches[1] . rand(0, 9);
}, $str);

备注

如果您的 PHP 版本低于 7.1,您不应使用 rand(),因为它是一个无法正常工作的错误功能。请改用 mt_rand(0, 9)

如果您需要随机数的加密安全性,请改用 random_int(0, 9)。此功能在 PHP 7.

中可用

您可以在完全不引用匹配字符串的情况下执行替换。只保留必须替换的单个字符。

代码:(PHP7.4 Demo)

替换奇数位置:

echo preg_replace_callback(
         '/^.|.\K./',
         fn() => rand(0,9),
         '1234567'
     );

替换偶数位置:

echo preg_replace_callback(
         '/.\K./',
         fn() => rand(0,9),
         '1234567'
     );