在整个字符串中随机使用preg_replace $ limit,而不仅仅是第一个$ limit匹配?

时间:2012-09-10 12:47:53

标签: php preg-replace

我期待preg_replace字符串的一部分只有3次,但是我不希望它匹配并仅替换前3个匹配,而是在整个字符串中更加多样化。这可能吗?

示例:

$post ['post_content']=preg_replace ('/ pizza /',' <a href="http://www.example.com">pizza</a> ',$post['post_content'],3);

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(无限制)。