【问题标题】:Find and Replace using function to manipulate matches first使用函数查找和替换首先操作匹配项
【发布时间】:2012-07-17 22:45:14
【问题描述】:

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

normal: { x: 50, y: 50 }

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

我应该直接读入整个文件,然后我的replace_callbacks 覆盖该文件吗?

【问题讨论】:

  • 我会说一次读取整个文件,进行正则表达式替换并将整个文件写回磁盘是最快的。假设这些文件适合内存。

标签: php regex sed replace


【解决方案1】:

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

如果你有一个非常大的文件,你可能会遇到麻烦,因为它不适合内存。 你当然可以,扫描文件,只替换你需要替换的。 如果您要摆弄文件句柄,并且只覆盖您需要覆盖的字节(并且不理会文件的其余部分),您可能会发现自己处于以下情况:

normal: { x: 10, y: 6 }

变成了

normal: { x: 5, y: 3 }

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

简而言之:按照您自己的建议去做:阅读、操作和回写。

【讨论】:

    【解决方案2】:

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

    <?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 }
    ?>
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-14
        • 1970-01-01
        • 2012-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-16
        • 2013-04-16
        相关资源
        最近更新 更多