2011-03-11 2 views
1

すべてのPHPファイルで特定の変数名を置き換えること、つまりすべてのPHPファイルで_$foo_から_$bar["foo"]_に名前を変更することについては厳しい質問があります。私はすべてのPHPファイルをテキストとして読み込み、必要な変数を置き換え、phpファイルをテキストとして書き戻すことを計画しています。すべてのPHPファイル内の変数を置き換えます

しかし、困難な点であり、私はちょうど直接$バー[ "foo" という]$ fooのを置き換えることはできません、例は次のとおりです。
1)_echo "hello $foo";_ < - として交換する必要性:
_echo "hello ".$bar["foo"];__echo "hello {$bar["foo"]}";_

2)_echo 'hello $foo';_ < - 私が処理するために多くの複雑なケースがあるでしょう想像できるもの

を交換する必要はありません。既存のツールやライブラリがこの種の安全な置き換えを行うことができるかどうか、誰かがより良いアルゴリズムを取り扱うことができるかどうかを知りたいですか?どうもありがとう。

次のように、PHPでこれを行うことができ
+1

http://stackoverflow.com/questions/19758/tools-for-php-code-refactoringは実際に私が言語ファイルを持っている関心 –

+0

であるかもしれません何万という変数の名前を変更する必要があります。私は手元にある変数名のリストを持っていて、変数をスクリプトに渡し、変数リストをループしてすべてのPHPファイルに置き換えようとしました。 – Joe

+0

おそらく、置換を行う小さなPHPスクリプトを書くことは唯一の方法です、私は各PHPファイルを読むことの後に考えることができるいくつかの方法があります 1)変数名でコンテンツを分割し、ページを置き換える必要がありますし、新しいPHP 2)文をphpファイルから取得し、変数が引用符の中にあるかどうかを確認し、変数の名前を変更する方法を決定します。 – Joe

答えて

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"; 
-------------------------------------------------------------------------------- 
+0

ありがとう!私は間違いなくこのスクリプトを試してみるべきです – Joe

1

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

それは一度だけである場合は、単に、例えば、まともなテキストエディタを使用しますNotepad++

[編集]あなたのコメントの後:[/編集]

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

すべてのファイルをループする小さなスクリプトを書く手元にあるすべての変数名をループしますが、あなたのスクリプトは誤って置き換えられます。 $ foo = "abc"; => {$ bar ['foo']} = "abc";それは...ですか? – Joe

+0

空白だけがあるかどうかを確認することができます。これは、すべてのインスタンスの99%をクリアするはずです。 – dtech

0

PHPでスクリプトを記述したり、Linux環境にある場合は、高度なSEDを使用しますか。

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

しかし、私はあなたが例種類が異なるかもしれないとあなたは、スクリプトを書く推薦する、これは、プログラムコード、ないニュース記事なので、構文エラーの無い範囲です。

+0

yah、プログラムコードを書くことは私の考えですが、処理するケースが多く、チェックは非常に複雑になりますので、既存のツールを使用するか他のアイデアを参照するだけでエラーになりやすい – Joe

1

私は通常何をして、私に多くの時間を節約したのですか?replace in filesをエディタに組み込んで使用しています。簡単で高速です。ここで

enter image description here

+0

あなたの提案しかし、私の場合は、単にテキストを他のテキスト – Joe

+0

と置き換えるだけで、もっと複雑で、最も重要なのは10000+の変数があり、100個以上のPHPファイルがorzを処理する必要があります... – Joe

+0

エディタはほとんど時間がかかりません100以上のファイルをPHPで正しい方法で設定するよりも、テキストエディタには通常、phpで文字列操作を行うことができる限りregEx機能があります..私のエディタはjEdit btw .. – amosrivera

関連する問題