PHP用计数替换多个相同的出现次数

时间:2018-04-02 05:33:31

标签: php regex

我如何更换此

  

Lorem ipsum random_5ac18d179707d dolor random_5ac18d179707d坐下来,   consectetur random_5ac18decebd4e adipiscing elit。

用这个

  

Lorem ipsum random_1 dolor random_1 sit amet,consectetur random_2   adipiscing elit。

它正在做的是匹配所有相同的“random_xxxxxxxxxxxxx”,并给予该组相似的匹配计数1.然后,每增加一组相似的匹配,计数就会增加。每组中可能有一个或多个。

我有以下非常接近但不太正确:

function replace($string) {
    $i = 1;
    return preg_replace_callback('/random_\w+/', function () use (&$i) {
        return 'random_' . $i++;
    }, $string);
}

输出以下

  

Lorem ipsum random_1 dolor random_2 sit amet,consectetur random_3   adipiscing elit。

有什么方法可以调整上面的代码片段吗?

或许有一些方法可以使用preg_match获取一系列唯一匹配,然后可以循环并替换为计数器?类似的东西:

$string = 'Lorem ipsum random_5ac18d179707d dolor random_5ac18d179707d sit amet, consectetur random_5ac18decebd4e adipiscing elit.';
preg_match('/random_\w+/', $string, $matches);
print_r($matches);

# to get the following array if possible?
Array
(
    [0] => random_5ac18d179707d
    [1] => random_5ac18decebd4e
)

4 个答案:

答案 0 :(得分:1)

你的第一个例子几乎解决了这个问题。只需使用一个辅助索引来跟踪您之前看过的和您没有看过的那些。

$matches[0]

由于tftest包含匹配的确切字符串,因此我们使用该值来查找索引。如果索引中存在密钥,我们将使用该数字的现有值。如果没有,我们分配一个新的。

答案 1 :(得分:0)

 $strings = explode($input," ");
 $outs = array();
 $last = "";
 for ($strings as $i){
     if(!$outs[$i]){
      $outs[$i] = count($outs)+1;
     }
 }
 for ($outs as $key=>$val){
   $input = str_replace($input,$key,"random".$val);
 }

答案 2 :(得分:0)

只是另一种解决方案

$string = 'Lorem ipsum random_5ac18d179707d dolor random_5ac18d179707d sit amet, consectetur random_5ac18decebd4e adipiscing elit.';

preg_match_all('/random_(\w+)/', $string, $matches);

$replace = array_values(array_unique($matches[1]));
array_unshift($replace, null);

echo str_replace(array_values($replace), array_keys($replace), $string);

答案 3 :(得分:0)

你可以这样做:

preg_match_all('~random_(\w+)~', $string, $m);
echo strtr($string, array_combine($s = array_unique($m[1]), range(1, count($s))));

Live demo

如果您认为\w+部分可能会出现在不关注random_的地方,则需要稍微修改上述代码:

preg_match_all('~random_\w+~', $string, $m);
echo strtr($string, array_combine($s = array_unique($m[0]), preg_filter('~^~', 'random_', range(1, count($s)))));