PHP将第一次出现替换为x,将第二次出现的字符串替换为y

Ahm*_*Ali 1 php regex string

这是一个棘手的问题,我正在尝试做的事情:

$str="abc def abc";
Run Code Online (Sandbox Code Playgroud)

我想替换first的发生abc123second的发生abc456 具有的preg_match现在是可能的,我代替ABC第一次出现123这样的

preg_replace('/abc/', '123', $str, 1);
Run Code Online (Sandbox Code Playgroud)

但是如何用456替换第二次出现,最重要的是如何一次做到并生成所需的字符串(即123 def 456).

注意:字符串是从外部源生成的.

谢谢艾哈迈尔

Mar*_*ijn 6

你非常接近:

$str = preg_replace('/abc/', '123', $str, 1); // will replace first 'abc'
$str = preg_replace('/abc/', '456', $str);    // will replace all others
Run Code Online (Sandbox Code Playgroud)

这将起作用的原因,是因为第二次正则表达式的第一次出现,实际上是第二项.
Pro:非常易读,非常容易理解和实现
Con:字符串将被重复两次(对于大字符串不好),选项有限


如果这不是你想要的,你可以使用 preg_replace_callback()

$firstHasBeenFound = false;
function magicFunction($matches){
    global $firstHasBeenFound;
    print_r($matches);
    if( !$firstHasBeenFound ){
        /* do something for the first time */ ;
        $firstHasBeenFound = true; // save for next round
    }
    else{
         /* do something for the test */ ;
    }
}

$str = preg_replace_callback('/abc/', 'magicFunction', $str);
Run Code Online (Sandbox Code Playgroud)

Pro:可以制作更多变体,更多地控制代码,只对字符串进行一次解析
Con:更难以阅读/实现

在我使用的这个例子中$firstHasBeenFound,你可以使用增量来做每个第二个事情,或者当你找到匹配7时做某事等等