我继承了一个相当大/丑陋的PHP代码库(语言不重要,这是一个通用的vim问题),没有任何引用正确(旧的PHP不介意,但新的PHP版本抛出警告)。
我想将$ something [somekey]转换成$ something ['somekey'],只要它尚未引用或包含字符$
我正在尝试构建一个正则表达式来引用键,但似乎无法让它合作。
这是我到目前为止所做的,但这不起作用,但可能有助于更好地解释我的问题。并表明我已经尝试过。
:%s/\v\$(.{-})\[(['"$]@<!.{-})\]/$\1['\2']/
我的目标是拥有这样的东西:
$something[somekey] = $something['somekey']
$somethingelse[someotherthing] = $something['someotherthing']
$another['key'] = $another['key'] (is ignored)
$yetanother["keykey"] = $yetanother["keykey"] (is ignored)
$derp[$herp] = $derp[$herp] (is ignored)
$array[3] = $array[3] (is ignored)
这些可以出现在文本的任何地方,甚至是同一行上的多个,甚至可以像$ something [key] $ something [key2]一样互相接触,我希望用$ something ['key'] $替换东西[ 'KEY2']
另一个问题,似乎在某些文件中有随机的javascript数组..它们有[]方括号。所以正则表达式需要检查它是否以括号前的$和text开头。
我可能会要求不可能,但是在我手动逐个编辑每个文件之前,对此的任何帮助都会很棒。
编辑:忘记密钥可以是数字,不应该引用。
答案 0 :(得分:2)
我尝试了以下操作,正确处理了您问题中的所有内容:
:%s/\[\(\I\i*\)\]/['\1']/g
或者,在parens中有可选的空格:
:%s/\[\s*\(\I\i*\)\s*\]/['\1']/g
并在parens之前检查$identifier
:
:%s/\(\$\i\+\)\[\s*\(\I\i*\)\s*\]/\1['\2']/g