我如何更换此
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
)
答案 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))));
如果您认为\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)))));