替换从第2开始的字符串

时间:2013-01-13 08:25:56

标签: php regex

如何替换字符串,使用普通替换或正则表达式仅替换第二个找到的结果

<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到最后一个。

提前感谢您的帮助。

3 个答案:

答案 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