php fwrite&附加到PHP函数

时间:2012-02-21 15:46:38

标签: php regex fopen fwrite

我正在使用fopen来访问我的PHP文件:

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

我想在此文件中搜索函数调用parent::process(); 如果存在,我会在此之后插入一个新的函数调用。

我尝试过使用preg_replace但它似乎与parent::process();不匹配 例如,我需要的结果就是这个。

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

然后写入我正在使用的文件:

fwrite($readFd, $content);

我想我必须遗漏一些重要的正则表达式。 希望有人能指出我正确的方向。

2 个答案:

答案 0 :(得分: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);

我希望这能解决你的问题。

答案 1 :(得分: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');
}

感谢您的帮助!