2013-12-13 5 views
0

Я унаследовал довольно большую/уродливую 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: забыли, что ключи могут быть числовыми и не должны указываться.

ответ

2

Я попытался следующие, которые обрабатываются все из вашего вопроса, правильно:

:%s/\[\(\I\i*\)\]/['\1']/g 

Или, с дополнительными пробелами внутри скобок:

:%s/\[\s*\(\I\i*\)\s*\]/['\1']/g 

А также проверка $identifier до того, как круглые скобки:

:%s/\(\$\i\+\)\[\s*\(\I\i*\)\s*\]/\1['\2']/g 
+0

Ах, это здорово! У меня только одна небольшая проблема, некоторые дополнительные критерии, о которых я не думал. $ something [1] совершенно допустимо, поэтому есть шанс изменить это, чтобы игнорировать числа? – Ollie

+0

@Ollie проверить мой обновленный ответ – blackbird

+0

Wow, perfect. Большое вам спасибо, вы, наверное, спасли меня так много часов и потянули волосы :) – Ollie

Смежные вопросы