人物取代...需要帮助

时间:2010-10-23 00:55:19

标签: php

我正在寻找一个函数,用数组中的rand字符替换字符串中的每个字符。

假设我有一个字符串

 $s="Abc";  

我有一个像

这样的每个角色的数组
$sr[1]=array('ÀÂÁÃÄÅĀĂĄДàáâãäåāăąǻα@'); 

$sr[2]=array('ßβЂБЪЬб฿'); 

$sr[3]=array('ÇĆĈĊČćĉċς'); 

如何将$ s字符串更改为(ÀβČ)或(ДбĈ).......在每次刷新Web浏览器时。

此致

4 个答案:

答案 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字符串中选择单个字符,您将只获得一个随机字节(也许一个角色,也许是垃圾)。