我正在寻找一个函数,用数组中的rand字符替换字符串中的每个字符。
假设我有一个字符串
$s="Abc";
我有一个像
这样的每个角色的数组$sr[1]=array('ÀÂÁÃÄÅĀĂĄДàáâãäåāăąǻα@');
$sr[2]=array('ßβЂБЪЬб฿');
$sr[3]=array('ÇĆĈĊČćĉċς');
如何将$ s字符串更改为(ÀβČ)或(ДбĈ).......在每次刷新Web浏览器时。
此致
答案 0 :(得分:1)
假设$ sr [1]包含第一个char的可能字母,$ sr [2]包含第二个char,等等作为数组:
$s="Abc";
$sr[1]=array('À', 'Â', 'Á', 'Ã', 'Ä', 'Å', 'Ā', 'Ă', 'Ą', 'Д', 'à', 'á', 'â', 'ã', 'ä', 'å', 'ā', 'ă', 'ą', 'ǻ', 'α', '@');
$sr[2]=array('ß', 'β', 'Ђ', 'Б', 'Ъ', 'Ь', 'б', '฿');
$sr[3]=array('Ç', 'Ć', 'Ĉ', 'Ċ', 'Č', 'ć', 'ĉ', 'ċ', 'ς');
$newStr = "";
for ($i = 0, $len = strlen($s); $i < $len; $i++) {
$newStr .= $sr[$i + 1][array_rand($sr[$i + 1])];
}
echo $newStr;
基本上,我们使用函数array_rand为每个数组中的每个字符选择一个随机索引。
如果你绝对需要字符串而不是数组,你可以用这样的方法解决问题:
$str = 'ÀÂ'; // etc.
$randomChar = mb_substr(str_shuffle($str), 0, 1);
正如其他一些人指出的那样,你可以使用关联数组。使用许多解决方案可以解决这个问题,可能很好地解释您需要做什么。 mrclay还指出了一些非常重要的东西,使用mb_substr()(多字节子字符串,字面意思)而不是substr()可能是个更好的主意。
我假设字符总是有序的。如果不是这样的话,那么最好使用一个关联数组:
$s="bAc";
$sr = array('A' => array('À', 'Â', 'Á', 'Ã', 'Ä', 'Å', 'Ā', 'Ă', 'Ą', 'Д', 'à', 'á', 'â', 'ã', 'ä', 'å', 'ā', 'ă', 'ą', 'ǻ', 'α', '@'),
'B' => array('ß', 'β', 'Ђ', 'Б', 'Ъ', 'Ь', 'б', '฿'),
'C' => array('Ç', 'Ć', 'Ĉ', 'Ċ', 'Č', 'ć', 'ĉ', 'ċ', 'ς'),
);
$newStr = "";
for ($i = 0, $len = strlen($s); $i < $len; $i++) {
$upperChar = strtoupper($s[$i]);
$newStr .= $sr[$upperChar][array_rand($sr[$upperChar])];
}
echo $newStr;
答案 1 :(得分:0)
我想不出有任何简单的方法可以做到这一点。你可以做一个转换。
您也可以使用键
执行数组操作$arr = array("A" => array('ÀÂÁÃÄÅĀĂĄДàáâãäåāăąǻα@');
取决于您的情况,如果您想要大写和小写,或者两者的输出相同,则转换为一个或另一个大小。
然后你可以做$ characterArray = $ arr [currChar];
然后使用rand从0到(characterArray length - 1)随机化,你的新角色将是characterArray [randomNumber]
您可以将其附加到新字符串。
你必须遍历字符串并遍历每个字符,转换它并附加到新字符串并输出新字符串。
这是我能想到的最简单的事情。
你应该检查密钥是否存在,如果密钥不存在,我只想保留传入的字符。
这将是您的翻译表。 $ arr = array( “A”=&gt;阵列( 'ÀÂÁÃÄÅĀĂĄДàáâãäåāăąǻα@', “B”=&gt;阵列( 'Allthebs'), “C”=&gt;阵列( 'Allthecs'), );
假设$ str是传入的字符串。
所以我们循环遍历字符串
for(i = 0, i < strlen($str), i++){
$currChar = strtoupper($str[i]);
//May want to check if array key exists here, if it does then do whats below.
//else you would just append the currChar to the newStr.
$characterArr = $arr[$currChar];
$arrlen = count($characterArr);
$ranNum = rand(0, $arrlen - 1);
$newStr .= $characterArr[$ranNum];
}
我用PHP编程已经有一段时间了,所以这可能不完全正确,但你明白了。
答案 2 :(得分:0)
好吧,对于初学者来说,像array('ÀÂÁÃÄÅĀĂĄДàáâãäåāăąǻα@')
这样的东西只会给你一个包含字符串的元素数组。但是,由于您可以像处理数组一样处理字符串,因此根本不需要数组。
// This would be easier if you label your replacement lists with the character they are replacing, for instance:
$replacements = array(
'a' => 'ÀÂÁÃÄÅĀĂĄДàáâãäåāăąǻα@',
'b' => 'ßβЂБЪЬб฿',
'c' => 'ÇĆĈĊČćĉċς',
etc...
);
// now you can iterate through each character of string and replace it with one randomly selected from the replacement string
$input_string = 'Abc';
$output_buffer = '';
for($i=0; $i<strlen($input_string); ++$i) {
// remember we used lower case keys in the $replacements hash
$key = strtolower($input_string[$i]);
if(isset( $replacements[$key] )) {
// if we have a replacement list for this key select a random char from it
$output_buffer .= $replacements[$key][rand(0, strlen($replacements[$key]))];
}
else {
// no replacement list found
$output_buffer .= $input_string[$i];
}
}
答案 3 :(得分:0)
看起来你的所有字符串都是UTF-8或其他multibyte encoding,所以Fayden的第一个解决方案是我看到的唯一安全字符串。
如果您使用字符串索引表示法(例如$str[2]
获取第3个字节)或substr
从UTF-8字符串中选择单个字符,您将只获得一个随机字节(也许一个角色,也许是垃圾)。