【发布时间】:2014-02-23 15:20:58
【问题描述】:
这是一个棘手的问题...我正在尝试替换我保存在数组中的文件中的一些字符串。 因为有很多文件……我一直在努力寻找最快的方法。 我试过这个(效果很好),但速度很慢。
- 首先解析所有文件并得到一个我想要的值的数组 改变(假设是 500)。
- 然后我写了一个 foreach 循环来逐个解析文件。
- 然后在其中,另一个 foreach 循环逐个遍历这些值 preg_replacing 文件中任何出现的数组值。
这需要很长时间,因为并非所有文件都需要使用 500 个数组元素进行解析。 所以我现在像这样更改代码:
- 解析每个文件并创建一个包含我要替换的值的数组。
- 再次在文件中搜索所有出现的每个数组值并替换它。
- 保存文件
我认为这会比旧方法快得多...我现在遇到的问题是读/写循环和数组循环... 我想尽可能快地做到这一点......因为会有很多文件要解析,有些文件有 100 多个值。 到目前为止,我在一个函数中得到了这个。
function openFileSearchAndReplace($file)
{
$holdcontents = file_get_contents($file);
$newarray = makeArrayOfValuesToReplace($holdcontents);
foreach ($newarray as $key => $value) {
$replaceWith = getNewValueFor($value);
$holdcontent = preg_replace('/\\b'.$value.'\\b/', $replaceWith, $holdcontents);
}
file_put_contents($file, $holdcontent, LOCK_EX); //Save and close
}
现在,这不起作用...它只是更改 1 个值,只是因为我在 foreach 之外有 file_put_contents 和 file_get_contents。 (更不用说它替换了它不应该替换的值。可能导致读/写在循环之外。)我必须把它们放在里面才能工作..但这会很慢..因为每次需要 3-4 秒文件进行更改,因为数组中有很多元素。
如何“打开文件”、“阅读”、“先更改 ALL 值”、“然后保存关闭文件”,这样我才能转到下一个。
编辑: 也许我没有很好地解释它我不知道......或者这太复杂了......我必须解析值数组......我无法避免......但不是(在每个循环),我打开文件搜索并替换1个值,关闭文件.....我想这样做: 打开文件,以数组或字符串或其他形式获取内容。对于所有值,我一直用等效值替换文本,并且当所有值都完成后......该数组或字符串写入文件。所以我只打开/关闭文件一次。而不是一直等待 php 读/写/关闭。
-谢谢
【问题讨论】:
-
这些数组项分别对应什么?行?,我认为在这些文件上运行类似
sed的东西会比读取->解析->处理->保存快得多 -
数组是单词……例如,首先我解析文件并从文件中收集所有水果单词……我想用蔬菜单词替换……每个都被替换通过它的等价物。 getNewValueFor() 为我做这件事。用土豆代替单词:apple。我使用 preg_replace('/\\b'.$value.'\\b/' 只匹配该值,与文本中出现的次数一样多。
-
@NeilMasters:
g修饰符在 PHP 中不存在。 -
您的权利。今天我的脑子很糊:)
-
我很好奇
makeArrayOfValuesToReplace()和getNewValueFor()的内容。可以发一下这两个函数吗?