使用函数查找和替换首先操作匹配

时间:2012-07-17 14:26:48

标签: php regex sed replace

我需要在包含数字的文件中搜索某些行,然后在替换文件之前对这些数字进行一些操作。例如,假设我有这样的一行:

normal: { x: 50, y: 50 }

我需要找到该行,将两个数字除以2,然后替换行中的数字并更新文件。我编写正则表达式找到该行没有问题,并使用preg_replace_callback()编写了一个PHP脚本来操作数字,但我需要能够替换数字然后更新文件中的那一行。我很乐意使用bash / sed / awk或Ruby或Python或PHP,但我不是其中任何一位的专家。

我应该只读取整个文件,执行replace_callbacks然后覆盖文件吗?

3 个答案:

答案 0 :(得分:1)

是。你的建议是最好的选择。 读取整个文件,替换数字(您已经这样做了),并将整个文件写回来。

如果你有一个非常庞大的文件,你可能会遇到麻烦,因为它不适合内存。 当然,您可以扫描文件,只替换需要更换的文件。 如果你打算使用文件句柄,并且只覆盖你需要覆盖的字节(并保留文件的其余部分),你可能会遇到以下情况:

normal: { x: 10, y: 6 }

成为

normal: { x: 5, y: 3 }

因此你丢失了一个字节,因为“10”变为“5”。 :-) 在您的示例中,您可以使用空格,但我不知道这是否适用于您将遇到的所有情况。

简而言之:做你自己提出的建议:阅读,操纵和回写。

答案 1 :(得分:1)

使用preg_replace,您可以使用自定义函数替换内容,如下所示..:  在这个例子中,值50将被发送到cnt函数,计算并发送回替换函数..:

<?php
function cnt($x){
    return $x/2;
}

$txt="normal: { x: 50, y: 50 }";  //Replace this with content of your file
$x=preg_replace("/(normal: { x: )(\d+)(, y: )(\d+)( })/e", "'\\1'.cnt(\\2).'\\3'.cnt(\\4).'\\5'", $txt);
echo $x; //Output:  normal: { x: 25, y: 25 }
?>

答案 2 :(得分:0)

您想要以字符串形式读取文件。使用preg_match获取您想要操作的数字,然后操纵它们。然后将这些数字放回字符串并将整个内容写入文件。