我遇到一个问题,因为PHP版本,我需要将代码从$array[stringindex]
更改为$array['stringindex'];
所以我想使用正则表达式查找所有文本,并将它们全部替换掉。如何查找看起来像这样的所有字符串? $array[stringindex]
。
答案 0 :(得分:3)
以下是PHP的解决方案:
$re = "/(\\$[[:alpha:]][[:alnum:]]+\\[)([[:alpha:]][[:alnum:]]+)(\\])/";
$str = "here is \$array[stringindex] but not \$array['stringindex'] nor \$3array[stringindex] nor \$array[4stringindex]";
$subst = "$1'$2'$3";
$result = preg_replace($re, $subst, $str);
你可以try it out interactively here。我搜索以字母开头的变量,否则$foo[42]
之类的东西会被转换为$foo['42']
,这可能是不可取的。
请注意,此处的所有解决方案都无法正确处理每个案例。
查看Sublime Text regex help,您似乎可以将(\\$[[:alpha:]][[:alnum:]]+\\[)([[:alpha:]][[:alnum:]]+)(\\])
粘贴到搜索框中,将$1'$2'$3
粘贴到替换字段中。
答案 1 :(得分:1)
这取决于您要用来替换的工具。 以sed为例,它会是这样的:
sed "s/\(\$array\)\[\([^]]*\)\]/\1['\2']/g"
答案 2 :(得分:1)
如果允许sed,您只需执行以下操作:
sed -i "s/(\$[^[]*[)([^]]*)]/\1'\2']/g" file
说明:
sed "s/pattern/replace/g"
是一个sed
命令,用于搜索模式并将其替换为replace。 g
选项表示每行替换多次。(\$[^[]*[)([^]]*)]
此模式由两组组成(在括号中)。第一个是美元,后跟一系列非[
个字符。然后是一个开口方括号,接着是一系列非关闭支架,然后是一个关闭方括号。\1'\2']
替换字符串:\1
表示插入第一个捕获的组(类似于\2
。基本上我们将\2
括在引号中(这是您想要的)。 -i
选项表示更改应应用于最终提供的原始文件。有关详细信息,请参阅man sed
。
这可以与find命令结合使用,如下所示:
find . -name '*.php' -exec sed -i "s/(\$[^[]*[)([^]]*)]/\1'\2']/g" '{}' \;
这会将sed命令应用于找到的所有php
个文件。