我有一个名为functions.php的文件。
它包含超过3000行的大量数据。
在此文件中间的某处有代码:
/*****************************************
My Custom Code
*****************************************/
if ( function_exists('my_code') )
my_code(array(
'name' => 'First instance',
'description' => 'Hello, hello.',
));
if ( function_exists('my_code') )
my_code(array(
'name' => 'Second instance',
'description' => 'Haha :)',
));
我列出了所有my_code数组,我得到了:
现在,我想要实现的是,当用户点击“第一个实例”旁边的X时,PHP在后台打开functions.php文件,找到确切的功能并删除它而不触及任何其他内容。
因此,删除“First Instance”后,functions.php文件应如下所示:
/*****************************************
My Custom Code
*****************************************/
if ( function_exists('my_code') )
my_code(array(
'name' => 'Second instance',
'description' => 'Haha :)',
));
知道怎么做到这一点?我知道如何打开文件,写入,删除,但我不知道如何消灭不仅仅是一行而是几行? :)
答案 0 :(得分:0)
如果您的代码始终采用您所描述的格式,则可以从文件中读取每5行,如果它是您要保留的实例,则将它们输出为字符串。然后将字符串写回原始文件。
但是,是的,代码修改代码是PAIN。将实例存储在数据库或格式化文件等数据结构中要好得多。
答案 1 :(得分:0)
我认为最好的方法是打开文件并遍历这些行。您需要匹配函数的每一行,或者您需要匹配第一行并跟踪打开和关闭括号{ }
的数量,以便知道何时到达它的末尾。
如果某行不匹配,则将其写入新文件。如果确实匹配则忽略它。然后最后你进行系统调用以对新文件进行语法检查(如果你的行匹配出错了):
system( "php -l newfile.php", &$retval );
然后检查返回值$retval
以确保它没问题(它将完全等于0)。如果没问题,那么用你的新文件覆盖functions.php。
if( $retval === 0 ) {
// the syntax is good
rename( "newfile.php", "functions.php");
}
您需要为此设置适当的路径。
现在所有这些都说,这不是一个好主意,我建议你不要实施它。更好的方法是将您的功能分解为单独的文件。然后使用INI配置文件或数据库来跟踪应加载的内容。其中任何一个都有能力进行编辑。即使是文本数据文件也比使用实际代码更好。
一旦你知道你应该加载什么,那么在开始时需要或包含适当的文件。
以下是使用数据库执行此操作的简单示例:
$res = mysql_query("SELECT file_name FROM load_functions");
if( mysql_error() ) {
// do something because the query failed
}
else {
while( list($file_name) = mysql_fetch_row($res) ) {
if( file_exists($file_name) ) {
require_once( $file_name );
}
else {
// warn because a file requested didn't exist
}
}
}
希望有所帮助