2012-02-21 32 views
0

我使用的fopen達到我的PHP文件:PHP的fwrite和追加到PHP函數

$readFd = @fopen($file, 'r+'); 

我想搜索這個文件的函數調用parent::process(); 而如果存在的話我會再插入一個新的此後調用函數。

我嘗試過使用preg_replace,但它似乎不匹配parent::process(); 例如,我需要的結果是這樣的。

public function process() { 
    parent::process(); 
    $this->newFunction(); 
} 

然後寫到我使用的文件:

fwrite($readFd, $content); 

我想我一定是失去了一些東西用正則表達式重要。 希望有人能指出我正確的方向。

回答

2

我會使用php函數fgets逐一讀取文件中的每一個內容,直到達到所需的行。然後你的指針會在你可以寫下自己的行的那一行之後。

編輯

我錯了,當你在一個特定的點寫的東西到一個文件,在該點之後一切都失去了。所以,我做了一個小測試以及與此想出了:

$handle = fopen($file,"r+"); 

$lines = array(); 
while(($line = fgets($handle)) !== false) { 
    $lines[] = $line; 
    if(strpos($line, 'parent::process()')) { 
     $lines[] = '$this->newFunction();'; 
    } 
} 
fseek($handle, 0); // reset pointer 
foreach($lines as $line) { 
    fwrite($handle, $line); 
} 
fclose($handle); 

我希望這能解決你的問題。

+0

好的,謝謝這是更進一步:) 我現在已經匹配我的功能,但是我仍然不確定如何在匹配後寫入下一行。 ($ line = fgets($ readFd))!== false)if(strpos($ line,「parent :: process()」)) //我想在查找父級後插入: :過程? }' 如果我使用fwrite,它仍會追加到文件中。 – user828941 2012-02-21 16:52:30

+0

好的我終於回到我的項目 並確認你的解決方案更簡單,它的效果很好:) – user828941 2012-02-24 01:46:16

0

我想出瞭解決方案,但是你的代碼看起來要短得多,所以我會在明天嘗試你的解決方案。

if(! $readFd = @fopen($file, "r+")) 
    return FALSE; 

$buffer = fread($readFd, 120000); 
fclose($readFd); 
$onDuplicate = FALSE; 
$lines = explode("\n", $buffer); 
foreach($lines AS $key => $line) { 
    if(strpos($line, "newFunction()")) { 
    $onDuplicate = TRUE; 
    } 
    if(strpos($line, "parent::process()")) { 
    $lines[$key] = "\t\tparent::process();\n\t\t//\$this->newFunction();\n"; 
    } 
} 

if(! $onDuplicate) { 
    $readFd = fopen($file, "w"); 
    $buffer = implode("\n", $lines)."\n"; 
    fwrite($readFd, $buffer); 
    fclose($readFd); 
} else { 
    var_dump('changes are already applied'); 
} 

感謝您的幫助!