我要怎么把这个换掉
Lorem ipsum random_5ac18d179707d dolor random_5ac18d179707d sit amet, 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
)
你的第一个例子几乎解决了这个问题。只需使用一个辅助索引来跟踪你以前见过的随机事件和没有见过的随机事件。
function replace($string) {
$i = 1;
$index = array();
return preg_replace_callback('/random_\w+/', function ($matches) use (&$i, &$index) {
$key = $matches[0];
if ( isset($index[$key]) ) {
$num = $index[$key];
} else {
$num = $i++;
$index[$key] = $num;
}
return 'random_' . $num;
}, $string);
}
由于$match[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);
}
只是另一种解决办法
$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);