1

preg_replace只查找字符串的某些部分 3 次,但是我不希望它只匹配和替换前 3 个匹配项,而是在整个字符串中更加多样化。这可能吗?

例子:

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

3 回答 3

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;

    }
于 2012-09-10T12:50:44.823 回答
0

我认为你可以做到。但这将是一个多步骤的过程。

第一:做一个preg_match_all()而不是替换第二个:做X个array_rands来获得'pizza'字符串的位置并从那个位置开始替换一个(使用子字符串)。

我认为您必须在每次替换后重做匹配,因为字符串的长度每次都会改变。

不要忘记删除从数组 rand 返回的索引,这样它就不会被使用两次。

于 2012-09-10T12:53:28.377 回答
0

跳过第 4 个参数,即限制 n 先通过手册

$limit: 每个主题字符串中每个模式的最大可能替换。默认为 -1(无限制)。

于 2012-09-10T13:04:44.903 回答