我正在使用fopen访问我的PHP文件:
$readFd = @fopen($file, 'r+');
我想在这个文件中搜索函数调用parent::process();
如果它存在,我会在它之后插入一个新的函数调用。
我尝试过使用preg_replace,但它似乎与parent::process();
不匹配例如,我需要的结果是这样的。
public function process() {
parent::process();
$this->newFunction();
}
然后将写入我正在使用的文件:
fwrite($readFd, $content);
我想我一定错过了regex的一些重要内容。希望有人能给我指明正确的方向。
我会使用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);
我希望这能解决你的问题。
我提出了解决方案,但您的代码似乎要短得多,所以我明天会尝试您的解决方案。
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');
}
谢谢你的帮助!