如何替换字符串,使用普通替换或正则表达式仅替换第二个找到的结果
<div id="fb-root"></div>
codes
<div id="fb-root"></div>
aas
<div id="fb-root"></div>
ss
<div id="fb-root"></div>
预期结果应为
<div id="fb-root"></div>
codes
aas
ss
应该删除第二个fb-root div到最后一个。
提前感谢您的帮助。
答案 0 :(得分:1)
可能有更好的方法可以做到这一点,但为什么不使用占位符代替第一个占位符,替换其余的占位符,然后更改占位符?
$full_text = file_get_contents($filename);
$text_to_replace = '<div id="fb-root"></div>';
$placeholder = '__PLACEHOLDER__';
$full_text = str_replace($text_to_replace, $placeholder, $full_text, 1);
$full_text = str_replace($text_to_replace, '', $full_text);
$full_text = str_replace($placeholder, $text_to_replace, $full_text);
这里的关键是第一次调用str_replace
时的第四个参数,它告诉函数只替换搜索文本的一个实例。它将仅用占位符替换第一个实例,然后第二个调用将删除所有剩余的实例,第三个调用将用原始文本替换占位符。
答案 1 :(得分:1)
试试这个:
$str = 'STRING HERE';
$result = preg_replace_callback('@<div\s+id="fb-root"></div>@', function(){
static $count = 0;
if(++$count > 1){
return null;
}else{
$args = func_get_arg(0);
return $args[0];
}
}, $str);
答案 2 :(得分:0)
你可以这样做:
$str = "...";
$needle = '<div id="fb-root"></div>';
$len = strlen($needle);
$pos = strpos($str, $needle) + $len; // skip the first occurance
while (($pos = strpos($str, $needle, $pos)) !== false)
$str = substr($str, 0, $pos) . substr($str, $pos + $len);// remove the needle