繁体   English   中英

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

[英]find and replace values in a flat-file using PHP

我认为这已经有了一个问题,但我找不到一个。 也许解决方案太容易了......无论如何,我有一个平面文件,并希望让用户根据名称更改值。 我已经整理出了使用fopen('a')模式创建新名称+值对,使用jQuery使用newValuenewName发送AJAX调用。 但是说内容看起来像这样:

host|http:www.stackoverflow.com
folder|/questions/
folder2|/users/

现在我想更改folder值。 所以我会将folder作为oldName发送,将/tags/作为newValue 覆盖价值的最佳方法是什么? 列表中的顺序无关紧要,名称将始终位于左侧,后跟| (管道),值然后new-line

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

一个非常简单的方法是在整个文件上使用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,最好还有一个额外的数据库到CSV脚本,而不仅仅是一个CSV文件。

您可以使用像APC这样的PHP功能将列表保留在内存中,并且每隔一段时间就将其写入磁盘。 这样你就只能在内存中不存在的时候读它。

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

如果这不是一个选项,另一种方法是使用sed和awk等shell级命令来进行内联正则表达式更改。 最后,将整个文件读成一个字符串,对它执行令人讨厌的正则表达式调整( s/// ),然后再将其写出来就可行了

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM