我期待preg_replace
字符串的一部分只有3次,但是我不希望它匹配并仅替换前3个匹配,而是在整个字符串中更加多样化。这可能吗?
示例:
$post ['post_content']=preg_replace ('/ pizza /',' <a href="http://www.example.com">pizza</a> ',$post['post_content'],3);
答案 0 :(得分:0)
使用类似的东西(可能需要一些调整):
$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;
}
答案 1 :(得分:0)
我认为你可以做到。但这将是一个多步骤的过程。
首先:做一个preg_match_all()
而不是替换
第二步:使用X数量的array_rands来获取'pizza'字符串的位置,并替换从该位置开始的字符串(使用子字符串)。
我认为你必须在每次替换后重做比赛,因为弦的长度每次都会改变。
不要忘记删除从数组rand返回的索引,因此它不会被使用两次。
答案 2 :(得分:0)
跳过第4个参数,即限制n通过manual第一个
<强> $极限:强> 每个主题字符串中每个模式的最大可能替换。默认为-1(无限制)。