这是一个棘手的问题,我正在尝试做的事情:
$str="abc def abc";
Run Code Online (Sandbox Code Playgroud)
我想替换first的发生abc与123和second的发生abc与456
具有的preg_match现在是可能的,我代替ABC第一次出现123这样的
preg_replace('/abc/', '123', $str, 1);
Run Code Online (Sandbox Code Playgroud)
但是如何用456替换第二次出现,最重要的是如何一次做到并生成所需的字符串(即123 def 456).
注意:字符串是从外部源生成的.
谢谢艾哈迈尔
你非常接近:
$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时做某事等等