正则表达式搜索和替换多个文件

时间:2012-04-20 12:43:41

标签: php regex perl notepad++

我需要在存储在多个文件夹中的多个php文件中重构一些代码。

我需要替换代码实例,如:

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

将文本(在这些文件中就位)作为:

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

请注意,$ variable名称会有所不同,但其他所有名称都相同*。

我在Windows机器上,但安装了php和perl - 宁愿使用它而不是sed。

我有Notepad ++,但不确定是否可以处理此类搜索和替换操作。

*我们的代码中有这一行的变体,一旦我理解了如何构建正确的正则表达式,我将自己尝试。

5 个答案:

答案 0 :(得分:1)

使用Notepad ++ 6.0版,您可以:

找到:trim\(ucfirst\((\$\w+\['first_name'\])\)\)\.' '\.trim\(ucfirst\((\$\w+\['last_name'\])\)\)

替换为:formatUserName\(\1,\2\)

答案 1 :(得分: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将使正则表达式与字面内的正则表达式匹配。

答案 2 :(得分:0)

未经测试(没有可用的Windows shell):

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 …

请注意匹配部分中的\1 backref和替代部分中的$1捕获缓冲区。

答案 3 :(得分: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

答案 4 :(得分:0)

也许最好的方法是使用File::Find模块填充@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;
}