代码之家  ›  专栏  ›  技术社区  ›  peirix

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

  •  3
  • peirix  · 技术社区  · 14 年前

    我想已经有问题了,但我找不到。也许解决方案太简单了…总之,我有一个平面文件,想让用户根据名称更改值。我已经使用 fopen('a') 模式,使用jquery发送Ajax调用 newValue newName . 但是,假设内容如下:

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

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

    我的第一个想法是阅读列表,将其存储在一个数组中,搜索所有 [0] 为了 老字号 ,然后更改 [1] 它属于它,然后写回一个文件。但我觉得有更好的办法解决这个问题?有什么想法吗?也许吧 regex ?

    2 回复  |  直到 14 年前
        1
  •  9
  •   2ndkauboy    14 年前

    对整个文件使用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文件。

        2
  •  5
  •   Matt S    14 年前

    您可以使用类似apc的PHP特性将列表保存在内存中,并经常将其写到磁盘上。这样你只会在记忆中不存在的时候读到它。

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

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