2012-04-20 20 views
0

複数のフォルダに保存されている複数のPHPファイル全体でいくつかのコードをリファクタリングする必要があります。Regexで複数のファイルを検索して置換する

私はのようなコードのインスタンスを交換する必要が

:(代わりに、これらのファイル内の)テキストで

trim(ucfirst($userinfo['first_name'])).' '.trim(ucfirst($userinfo['last_name'])) 

として:

formatUserName($userinfo['first_name'],$userinfo['last_name']) 

$変数名が異なることがあることに注意してください、しかし、すべてのものそれ以外は同じ*でしょう。

私はWindowsマシンを使用していますが、phpとperlがインストールされています - sedの代わりに使用することをお勧めします。

私はNotepad ++を持っていますが、そのような検索と置換操作を処理できるかどうかはわかりません。

*私たちのコードにはこの行のバリエーションがあります。これは適切な正規表現を構築する方法を理解してからは、私自身で試みます。

+2

あなたの質問はありますか? – TLP

+2

いくつのファイルについて話していますか?理由がある場合は、プロジェクトを作成し(すべてのファイルを追加する)、プロジェクト内のすべてのファイル(PSPadを使用)で検索と置換を実行できるエディタを使用するだけです。次に、名前変数を検索して、この問題のすべてのインスタンスを更新したことを確認します。 – Armatus

+0

@ウィル - これはプログラミングの質問です - 私は使用する適切な正規表現を決定しようとしています。 – siliconpi

答えて

1

、あなたが行うことができます:formatUserName\(\1,\2\)

+0

私はそれがformatUserName(\ 1、\ 2)である必要があると思う – siliconpi

+0

@SidB:良いキャッチ、答えが編集されました。 – Toto

+0

すごくうまくいっています...! :D – siliconpi

0

あなたの質問は、メタキャラクターをどのように扱うかについてです。ここでそれを行う方法があります。

my $find = q|trim(ucfirst($userinfo['first_name'])).' '.trim(ucfirst($userinfo['last_name']))|; 
my $replace = q|formatUserName($userinfo['first_name'],$userinfo['last_name'])|; 

while (<>) { 
    s/\Q$find\E/$replace/g; 
} 

\Q ... \E変数がまだ補間されているが、正規表現は、文字通りその中にあるものと一致するようになります。

メモ帳++バージョン6.0で
+0

変数名が違うとの質問がありました。 – daxim

+0

@ダクシム質問は多くのことを言った。私はメタキャラクターについてその部分に答えました。 – TLP

+0

ええ、変数名$ userinfoは$ admininfo、$ insinfoなどとなりますが、 'first_name'と 'last_name'の間で同じになります。 – siliconpi

0

テストされていない(利用可能なWindowsシェル):

perl -i.bak -lpe"BEGIN { $varname = qr/\$[a-z]+/; } s/trim\(ucfirst\(($varname)\['first_name'\]\)\)\.' '\.trim\(ucfirst\(\1\[\'last_name'\]\)\)/formatUserName($1['first_name'],$1['last_name'])/;" file1.php file2.php file3.php … 

注意と交換trim\(ucfirst\((\$\w+\['first_name'\])\)\)\.' '\.trim\(ucfirst\((\$\w+\['last_name'\])\)\)

を見つけますマッチ部分に\1 backref、サブ部分に$1キャプチャバッファがあります。

+1

Windowsシェルはあなたのために自動的にパラメータをglobしません。 WIndows Perlでは、バックアップファイルなしでインプレース編集を行うことはできません: '-i.bak'などが必要です。 – Borodin

0

スクリプト:

$_ = 'trim(ucfirst($userinfo[\'first_name\'])).\' \'.trim(ucfirst($userinfo[\'last_name\']))'; 
s/^trim\(ucfirst\((\$[^\)]+)\)\)\.'\s+'\.trim\(ucfirst\((\$[^\)]+)\)\)$/formatUserName($1,$2)/; 
print $_; 

出力:

formatUserName($userinfo['first_name'],$userinfo['last_name']) 

テストリンク:http://ideone.com/4e0Bf

0

おそらく最良の方法は、0を使用することですモジュールに@ARGVを入力してから、ループ内の置換を単に実行します(while (<>)ループ内)。

このプログラムはアイデアを示していますが、正規表現をテストしていないので注意してください。ファイルのバックアップコピーは*.php.bakとして保存されます。

use strict; 
use warnings; 

use File::Find; 

our @ARGV =(); 

find sub { 
    push @ARGV, $File::Find::name if /\.php$/; 
}, 'C:\path\to\tree\root'; 

$^I = '.bak'; 

while (<>) { 
    s<\Qtrim(ucfirst(\E\$(\w+)\Q['first_name'])).' '.trim(ucfirst(\E\$\1\Q['last_name']))\E> 
    <formatUserName(\$$1['first_name'],\$$1['last_name'])>g; 
    print; 
} 
関連する問題