我有一个棘手的问题,即在所有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';_
< - 无需替换任何内容
我可以想象会有许多复杂的案件需要处理。想知道是否有任何现有的工具或库可以安全地进行这种替换,或者任何人都有更好的算法来处理?非常感谢。
答案 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
在我的编辑器中构建它。简单快捷。
答案 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
但是我建议你编写一个脚本,因为你可能有不同类型的案例,这是程序代码,而不是新闻文章,因此没有语法错误的范围。