替换所有php文件中的变量

时间:2011-03-11 07:14:41

标签: php variables replace

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

但难点在于,我不能直接用 $ bar [“foo”] 替换 $ foo ,案例如下:
1)_echo "hello $foo";_< - 需要替换为:
_echo "hello ".$bar["foo"];__echo "hello {$bar["foo"]}";_

2)_echo 'hello $foo';_< - 无需替换任何内容

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

4 个答案:

答案 0 :(得分:1)

您可以使用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']}");

答案 1 :(得分:1)

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

enter image description here

答案 2 :(得分: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";
--------------------------------------------------------------------------------

答案 3 :(得分:0)

要么在PHP中编写脚本,要么在Linux环境下使用高级SED。

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

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