Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP查找并替换平面文件中的值_Php_Regex_Replace_Flat File - Fatal编程技术网

使用PHP查找并替换平面文件中的值

使用PHP查找并替换平面文件中的值,php,regex,replace,flat-file,Php,Regex,Replace,Flat File,我想这方面已经有问题了,但我找不到问题。也许解决方法太简单了。。。无论如何,我有一个平面文件,希望让用户根据名称更改值。我已经使用fopen('a')模式创建了新的名称+值对,使用jQuery发送带有newValue和newName的AJAX调用。但如果说内容是这样的: host|http:www.stackoverflow.com folder|/questions/ folder2|/users/ 现在我想更改文件夹的值。因此,我将把文件夹作为oldName和/tags/作为newValu

我想这方面已经有问题了,但我找不到问题。也许解决方法太简单了。。。无论如何,我有一个平面文件,希望让用户根据名称更改值。我已经使用
fopen('a')
模式创建了新的名称+值对,使用jQuery发送带有
newValue
newName
的AJAX调用。但如果说内容是这样的:

host|http:www.stackoverflow.com
folder|/questions/
folder2|/users/
现在我想更改
文件夹
的值。因此,我将把
文件夹作为
oldName
/tags/
作为
newValue
发送。覆盖该值的最佳方式是什么?列表中的顺序无关紧要,名称将始终位于左侧,后跟一个
|
(管道)、值,然后是一个
新行


我的第一个想法是读取列表,将其存储在数组中,在所有
[0]
中搜索
oldName
,然后更改属于它的
[1]
,然后将其写回文件。但我觉得有更好的办法吗?有什么想法吗?也许?

您可以使用类似APC的PHP功能将列表保存在内存中,并每隔一段时间将其写入磁盘。这样的话,你只能在它不存在于记忆中的时候才能读到它

如果您希望以性能为导向,那么在CSV中存储此信息可能不是最好的开始。如果您不想使用真正的RDMS(MySQL),那么我建议使用SQLite。在这种情况下,它提供了您正在寻找(更新)的所有功能,它的作用与CSV完全相同,因为它只是硬盘上的一个文件,没有并发性


如果这不是一个选项,另一种方法是使用像sed&awk这样的shell级命令来进行内联正则表达式更改。最后,将整个文件读入一个字符串,对其执行讨厌的正则表达式调整(
s///
),然后再次将其写出,这将是一种非常简单的方法,即对整个文件使用str_replace():

// read the file
$file = file_get_contents('filename.csv');
// replace the data
$file = str_replace('folder|oldValue', 'folder|newValue', $file);
// write the file
file_put_contents('filename.csv', $file);

一次只能有一个用户访问该文件。但数据库总是一个更好的主意。如果您需要CSV,最好有一个附加的DB-to-CSV脚本,而不仅仅是一个CSV文件。

不要忘记某种锁定机制。如果两个脚本同时编辑文件,那么肯定会有问题。CSV是“逗号分隔值”的首字母缩写,并且分隔符是管道而不是逗号。尽管许多CSV导入程序允许您将分隔符设置为非逗号的字符,但我仍然认为最好将其称为“平面文件”@是的,这只供管理员使用。每个管理员将有一个文件。但为了安全起见,我会研究一下锁定机制(:谢谢你提醒我。@Whitive Fork,是的,我知道,但这两者之间真的没有什么实际区别,是吗?“当我使用一个词时,”Humpty Dumpty以相当轻蔑的语气说。“它只是我选择它的意思,不多也不少。”“问题是,”爱丽丝说,“你是否能让单词有这么多不同的含义。”:)选择准确的术语可以避免混淆,并有助于相关的标注(:没有什么比引用Lewis Carroll的话更能说明语义的含义了。重点是。性能不是问题,真的。文件最多可能有5行,这就是为什么我不想麻烦MySQL的原因。但是每个客户端/用户将有一个文件。不过,我会看看SQLite。谢谢。