文字列の一部を3回だけ探していpreg_replace
ますが、最初の3つの一致だけを一致させて置き換えるのではなく、文字列全体でより多様にしたいと考えています。これは可能ですか?
例:
$post ['post_content']=preg_replace ('/ pizza /',' <a href="http://www.example.com">pizza</a> ',$post['post_content'],3);
文字列の一部を3回だけ探していpreg_replace
ますが、最初の3つの一致だけを一致させて置き換えるのではなく、文字列全体でより多様にしたいと考えています。これは可能ですか?
例:
$post ['post_content']=preg_replace ('/ pizza /',' <a href="http://www.example.com">pizza</a> ',$post['post_content'],3);
次のようなものを使用します(多少の調整が必要になる場合があります)。
$p = $post ['post_content'];
if (preg_match_all('/ pizza /',$p, $matches)) {
$rand = array_rand($matches[0], 2);
foreach($rand as $rand_key) {
$p=replace_num($matches[0][$rand_key], "XXX",$p, $rand_key+1);
}
}
echo $p;
function replace_num($from, $to, $string,$num) {
$pos=-1;
$i=0;
while($pos!==false && $i<$num) {
$pos = strpos($string, $from, $pos+1);
$i++;
}
if ($pos) {
return substr($string, 0, $pos) . str_replace($from, $to, substr($string,$pos, strlen($from))) . substr($string, $pos) ;
}
return $string;
}
できると思います。しかし、それは複数のステップからなるプロセスになります。
最初:置換のpreg_match_all()
代わりにを実行します2番目:'pizza'文字列の位置を取得し、その位置から始まるものを置換するために、X個のarray_randsを実行します(部分文字列を使用)。
文字列の長さは毎回変わるので、交換するたびに試合をやり直す必要があると思います。
配列randから返されるインデックスを削除して、2回使用されないようにすることを忘れないでください。
nを制限する4番目のパラメータをスキップして最初にマニュアルを通過します
$ limit: 各サブジェクト文字列の各パターンの可能な最大置換。デフォルトは-1(制限なし)です。