Заменить переменные во всех файлах php - PullRequest
1 голос
/ 11 марта 2011

У меня сложный вопрос о замене определенного имени переменной во всех файлах php, т. Е. Переименовать _$foo_ в _$bar["foo"]_ во всех файлах php.Я планирую прочитать весь php-файл как текст и заменить нужные переменные, а затем записать php-файл как текст.

Но сложность заключается в том, что я не могу просто заменить $ foo с $ bar ["foo"] напрямую, случаи:
1) _echo "hello $foo";_ <- необходимо заменить на: <br>_echo "hello ".$bar["foo"];_ или _echo "hello {$bar["foo"]}";_

2) _echo 'hello $foo';_ <- не нужно ничего заменять </p>

Я могу себе представить, что будет много сложных дел, которые нужно будет обработать.Хотите знать, если есть какие-либо существующие инструменты или библиотеки, можно безопасно заменить этот вид, или у кого-нибудь есть лучший алгоритм для обработки?Большое спасибо.

Ответы [ 4 ]

1 голос
/ 11 марта 2011

Вот пример сценария 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";
--------------------------------------------------------------------------------
1 голос
/ 11 марта 2011

То, что я обычно делаю и сэкономило мне много времени, это использование replace in files, встроенного в мой редактор.Легко и быстро.

enter image description here

1 голос
/ 11 марта 2011

Вы можете сделать это с помощью php следующим образом:

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

Если это единовременно, просто используйте приличный текстовый редактор, например Notepad ++ .

[править] После вашего комментария: [/ edit]

$orFile = file_get_contents("filename");
$newFile = preg_replace("#^(\s*)\$foo#U","\\1$bar['foo']",$orFile);
$newFile = preg_replace("#{?\$foo}?#", "{\$bar['foo']}");
0 голосов
/ 11 марта 2011

Либо напишите скрипт на PHP, либо используйте расширенный SED, если вы работаете в среде Linux.

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

Однако я бы порекомендовал вам написать скрипт, так как у вас могут быть другиетипы случаев, и это программный код, а не новостная статья, поэтому нет синтаксической ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...