2011-03-11 15 views
1

我有一個棘手的問題,即在所有php文件中替換某個變量名,即將所有php文件中的_$foo_重命名爲_$bar["foo"]_。我打算將所有的php文件作爲文本讀取並替換所需的變量,然後將文件寫回爲文本。替換所有php文件中的變量

但難點是,我不能隨便更換$ foo的$條[ 「富」]直接,情況是:
1)_echo "hello $foo";_ < - 需要爲更換:
_echo "hello ".$bar["foo"];__echo "hello {$bar["foo"]}";_

2)_echo 'hello $foo';_ < - 無需更換任何

我可以想象會有很多複雜的情況來處理。想知道是否有任何現有的工具或庫可以安全地進行這種替換,或者任何人有更好的算法來處理?非常感謝。

+1

http://stackoverflow.com/questions/19758/tools-for-php-code-refactoring可能會感興趣 –

+0

其實我有一個語言文件數以萬計的變量需要重新命名。我手頭上有變量名的列表,並打算將變量傳遞給腳本,讓它遍歷變量列表並替換所有php文件。 – Joe

+0

可能寫一個小的php腳本來做替換是唯一的方法,我可以通過幾種方式讀取每個php文件後想到的方法 1)通過變量名分割內容,然後分析每個元素以決定哪些變量在該頁面需要被替換,然後回寫新的php語句,通過語句從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

可以按如下方式使用PHP這樣做:

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或使用先進的SED,如果你是在Linux環境。

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

不過我建議你寫一個腳本,因爲您可能具有不同類型的案件,這是一個程序代碼,不是新聞報道,所以沒有語法錯誤的範圍。

+0

嗯,寫一個程序代碼是我的想法,但它很容易出錯,因爲有很多情況需要處理,並且檢查將非常複雜,只是看到任何現有的工具都可以使用或其他想法 – Joe

1

我平時做的事,爲我節省了很多時間,就是用我編輯器裏面的replace in files。方便快捷。

enter image description here

+0

thx您的建議,但我的情況更復雜,然後只是簡單地用其他文本替換文本 – Joe

+0

,最重要的是有10000多個變量,並且100個php文件需要處理orz ... – Joe

+0

編輯器不會花費盡可能多的時間來完成100 +文件比在php中設置這個正確的方式,加上文本編輯器通常有regEx功能,只要你可以在PHP中使用字符串操作..我的編輯器是jEdit btw .. – amosrivera