【问题标题】:Replace variables in all php files替换所有php文件中的变量
【发布时间】:2011-07-13 07:20:27
【问题描述】:

我有一个关于在所有 php 文件中替换某些变量名的棘手问题,即将所有 php 文件中的 _$foo_ 重命名为 _$bar["foo"]_。我打算将所有 php 文件作为文本读取并替换所需的变量,然后将 php 文件作为文本写回。

但难点是,我不能直接把$foo换成$bar["foo"],情况有:
1)_echo "hello $foo";_ _echo "hello ".$bar["foo"];__echo "hello {$bar["foo"]}";_

2) _echo 'hello $foo';_

我可以想象会有很多复杂的案件需要处理。想知道是否有任何现有的工具或库可以安全地进行这种替换,或者任何人有更好的算法来处理?非常感谢。

【问题讨论】:

  • 实际上我有一个包含数万个变量的语言文件需要重命名。我手头有变量名列表,打算将变量传递到脚本中,让它循环遍历变量列表并替换所有 php 文件。
  • 可能写一个小的php脚本来做替换是唯一的方法,在阅读每个php文件后我能想到几种方法1)按变量名拆分内容,然后分析每个元素来决定页面中哪些变量需要替换,然后写回新的php 2)从php文件中逐句抓取,查看变量是否在引号内,决定如何重命名变量。跨度>
  • 但是这两种方式都需要大量的编程工作来检查条件并且容易遗漏一些情况,所以我想知道是否有人以前做过或有用于此任务的有用工具

标签: php variables replace


【解决方案1】:

这里是一个示例 perl 脚本,可以为您提供的示例完成这项工作:

已更新以接受许多替换。

#!/usr/bin/perl
use Modern::Perl;

my %repl = ('$foo' => '{$bar["foo"]}', '$baz' => '{$bar["baz"]}');
while(<DATA>) {
    chomp;
    say "before : $_";
    foreach my $key(keys %repl) {
        s/(_[^']*)(\Q$key\E)([^']*_)/$1$repl{$2}$3/;
    }
    say "after  : $_";
    say '-'x80;
}

__DATA__
_$foo_
_echo "hello $foo";_
_echo "hello ".$bar["foo"];_
_echo "hello {$bar["foo"]}";_
_echo 'hello $foo';_
$foo = "abc";
_$baz_
_echo "hello $baz";_
_echo "hello ".$bar["baz"];_
_echo "hello {$bar["baz"]}";_
_echo 'hello $baz';_
$baz = "abc";

输出:

before : _$foo_
after  : _{$bar["foo"]}_
--------------------------------------------------------------------------------
before : _echo "hello $foo";_
after  : _echo "hello {$bar["foo"]}";_
--------------------------------------------------------------------------------
before : _echo "hello ".$bar["foo"];_
after  : _echo "hello ".$bar["foo"];_
--------------------------------------------------------------------------------
before : _echo "hello {$bar["foo"]}";_
after  : _echo "hello {$bar["foo"]}";_
--------------------------------------------------------------------------------
before : _echo 'hello $foo';_
after  : _echo 'hello $foo';_
--------------------------------------------------------------------------------
before : $foo = "abc";
after  : $foo = "abc";
--------------------------------------------------------------------------------
before : _$baz_
after  : _{$bar["baz"]}_
--------------------------------------------------------------------------------
before : _echo "hello $baz";_
after  : _echo "hello {$bar["baz"]}";_
--------------------------------------------------------------------------------
before : _echo "hello ".$bar["baz"];_
after  : _echo "hello ".$bar["baz"];_
--------------------------------------------------------------------------------
before : _echo "hello {$bar["baz"]}";_
after  : _echo "hello {$bar["baz"]}";_
--------------------------------------------------------------------------------
before : _echo 'hello $baz';_
after  : _echo 'hello $baz';_
--------------------------------------------------------------------------------
before : $baz = "abc";
after  : $baz = "abc";
--------------------------------------------------------------------------------

【讨论】:

    【解决方案2】:

    我通常做的并且为我节省了很多时间的是使用在我的编辑器中构建的replace in files。简单快捷。

    【讨论】:

    • 感谢您的建议,但我的情况比简单地用其他文本替换文本更复杂
    • 最重要的是有10000+个变量,100+个php文件需要处理orz...
    • 编辑器处理 100 多个文件所花费的时间比在 php 中正确设置文件所花费的时间要少,而且文本编辑器通常具有 regEx 功能,只要您可以使用字符串即可php中的操作..我的编辑器是jEdit btw ..
    【解决方案3】:

    您可以使用 php 执行此操作,如下所示:

    file_put_contents("filename", preg_replace("#{?\$foo}?#", "{\$bar['foo']}", file_get_contents("filename")));
    

    如果是一次性的,只需使用一个像样的文本编辑器,例如Notepad++.

    [edit]在您发表评论后:[/edit]

    $orFile = file_get_contents("filename");
    $newFile = preg_replace("#^(\s*)\$foo#U","\\1$bar['foo']",$orFile);
    $newFile = preg_replace("#{?\$foo}?#", "{\$bar['foo']}");
    

    【讨论】:

    • 我可以编写一个小脚本来遍历所有文件并遍历我手头的所有变量名,但是您的脚本会错误地替换例如$foo = "abc"; => {$bar['foo']} = "abc";是吗?
    • 你可以检查之前是否只有空格,这应该清除所有实例的 99%。
    【解决方案4】:

    如果您在 linux 环境中,请使用 PHP 编写脚本或使用高级 SED。

    http://lowfatlinux.com/linux-sed.html

    但是我建议你写一个脚本,因为你可能有不同类型的案例,这是一个程序代码,不是一篇新闻文章,所以没有语法错误的范围。

    【讨论】:

    • 是啊,写程序代码是我的想法,但是很容易出错,因为要处理的情况很多,而且检查会很复杂,只是看看可以使用任何现有的工具或其他想法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    相关资源
    最近更新 更多