我需要在存储在多个文件夹中的多个php文件中重构一些代码。
我需要替换代码实例,如:
trim(ucfirst($userinfo['first_name'])).' '.trim(ucfirst($userinfo['last_name']))
将文本(在这些文件中就位)作为:
formatUserName($userinfo['first_name'],$userinfo['last_name'])
请注意,$ variable名称会有所不同,但其他所有名称都相同*。
我在Windows机器上,但安装了php和perl - 宁愿使用它而不是sed。
我有Notepad ++,但不确定是否可以处理此类搜索和替换操作。
*我们的代码中有这一行的变体,一旦我理解了如何构建正确的正则表达式,我将自己尝试。
答案 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'])
答案 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;
}