Я унаследовал довольно большую/уродливую PHP-кодовую базу (язык неважен, это общий вопрос vim), где ничего не цитируется должным образом (старый php не против, но новые версии php вызывают предупреждения).Найти/заменить строку, которая не содержит кавычек
Я хотел бы, чтобы превратить $ что-то [somekey] в $ что-то [ «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)
Они могут появляться в любом месте в тексте, даже несколько на одной и той же линии, и даже касаясь друг друга, как $ что-то [ключ] $ что-то [key2], который я бы хотел заменить на $ something ['key'] $ something ['key2']
Другая проблема: в некоторых файлах есть случайные массивы javascript .. которые имеют [] квадрат кронштейны. Поэтому регулярное выражение должно проверять, будет ли оно начинаться с $ и текста перед скобками.
Возможно, я прошу о невозможности, но любая помощь по этому вопросу была бы большой, прежде чем я сойду без ума от редактирования каждого файла один за другим вручную.
EDIT: забыли, что ключи могут быть числовыми и не должны указываться.
Ах, это здорово! У меня только одна небольшая проблема, некоторые дополнительные критерии, о которых я не думал. $ something [1] совершенно допустимо, поэтому есть шанс изменить это, чтобы игнорировать числа? – Ollie
@Ollie проверить мой обновленный ответ – blackbird
Wow, perfect. Большое вам спасибо, вы, наверное, спасли меня так много часов и потянули волосы :) – Ollie