0

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

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

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

使用文本(在这些文件中)作为:

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

请注意,$ 变量名称会有所不同,但其他所有内容都相同*。

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

我有 Notepad++,但不确定它是否可以处理这样的搜索和替换操作。

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

4

5 回答 5

1

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

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

用。。。来代替: formatUserName\(\1,\2\)

于 2012-04-20T13:01:18.280 回答
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将导致正则表达式从字面上匹配其中的内容,尽管变量仍然被插值。

于 2012-04-20T12:59:04.550 回答
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 和$1subst 部分中的捕获缓冲区。

于 2012-04-20T13:03:02.797 回答
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

于 2012-04-20T13:08:42.530 回答
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;
}
于 2012-04-20T13:36:36.960 回答