我preg_replace
只查找字符串的某些部分 3 次,但是我不希望它只匹配和替换前 3 个匹配项,而是在整个字符串中更加多样化。这可能吗?
例子:
$post ['post_content']=preg_replace ('/ pizza /',' <a href="http://www.example.com">pizza</a> ',$post['post_content'],3);
我preg_replace
只查找字符串的某些部分 3 次,但是我不希望它只匹配和替换前 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()
而不是替换第二个:做X个array_rands来获得'pizza'字符串的位置并从那个位置开始替换一个(使用子字符串)。
我认为您必须在每次替换后重做匹配,因为字符串的长度每次都会改变。
不要忘记删除从数组 rand 返回的索引,这样它就不会被使用两次。
跳过第 4 个参数,即限制 n 先通过手册
$limit: 每个主题字符串中每个模式的最大可能替换。默认为 -1(无限制)。