php では、複数の結果を一致させるために通常の一致が使用され、結果の 1 つがランダムに置き換えられます。
をすべて置き換えるのが非常に簡単な場合は、preg_replace を使用します。ただし、成功した複数のマッチング結果のうち 1 つをランダムに置き換える必要があるため、少し面倒です。それを解決するために自分で関数を書きました。他に良い方法があるかどうかはわかりません。例「私には夢があります。私には夢があります。私には夢があります。私には夢があります。」は表現「/i/」と一致します。 上記の文字列には一致する結果が 4 つあり、そのうちの 1 つをランダムに置き換えるだけです。 i を hell に置き換えます。
私のコードは次のとおりです:
//正则处理函数 function rand_replace_callback($matches) { global $g_rand_replace_num, $g_rand_replace_index, $g_rand_replace_str; $g_rand_replace_index++; if($g_rand_replace_num==$g_rand_replace_index){ return $g_rand_replace_str; }else { return $matches[0]; } } //随机正则替换函数 如果有多个匹配的单元,随机替换其中的一个。 //注意global $g_rand_replace_num, $g_rand_replace_index, $g_rand_replace_str;这三个全局变量,不要与其它的冲突 //依赖一个正则处理函数 记录匹配单元总数,取一个总数范围内的随机值,在正则处理函数中判断相等则处理。 function rand_preg_replace($pattern, $t_g_rand_replace_str, $string) { global $g_rand_replace_num, $g_rand_replace_index, $g_rand_replace_str; preg_match_all($pattern, $string, $out);$find_count = count($out[0]); //匹配的单元总数 $g_rand_replace_num = mt_rand(1, $find_count); //符合正则搜索条件的集合 $g_rand_replace_index = 0; //实际替换过程中的index $g_rand_replace_str = $t_g_rand_replace_str; echo "现在找到符合的有{$find_count}个<br>"; $ss=preg_replace_callback($pattern,"rand_replace_callback",$string); return $ss; } $string = "I have a dream. I have a dream. I have a dream. I have a dream."; echo rand_preg_replace('/I/', "hell", $string);
考え方を広げて、最初の結果が置き換えられるという概念を減らしたい場合はどうすればよいでしょうか? 最初に置き換えられることが良くない場合や、最初に置き換えられるためには少数の結果のみが必要な場合があります。