2013-01-13 90 views
0

我如何替換字符串,使用正常的替換或正則表達式來僅更換2次發現的結果起替換字符串開始2日

<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

不要包括它的第一個地方在頁面上 – Ibu

+0

是的,我不希望它有作爲3 div的。但有一個原因,爲什麼這個項目有4個,不幸的是我不能改變。 – fedmich

回答

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,它告訴函數只替換搜索文本的一個實例的第四個參數。它將僅用佔位符替換第一個實例,然後第二個調用將刪除所有剩餘的實例,第三個調用將用原始文本替換佔位符。

+0

謝謝,這是可能的。但3替換可能會慢一點。讓我們等待其他建議。 – fedmich

+1

當然,這是你的呼叫,但這聽起來像是一個過早的優化。執行一些替換操作只需幾微秒就可以在任何合理大小的文件上執行。 – AgentConundrum

+0

+1,是的,你的答案是我通常使用的。 我沒有爲此而優化,只是想回想一下另一個正則表達式來做這種事情。 – fedmich

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); 
+0

謝謝,yep回調也可以,但可能會慢一點。 – fedmich

+0

我記得之前有一些可以使用的正則表達式修飾/技巧 – fedmich

+0

在這種情況下,看看這個http://stackoverflow.com/questions/2850092/skip-first-regex-match – shawndreck

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