2017-01-11 9 views
0

У меня есть код, как показано нижевозвышенного регулярное выражение, чтобы добавить IsSet для всех переменных

$list['name'] = $obj->name; 
$list['desc'] = $obj->desc; 

и так далее (у меня есть более чем 1000 строк, как это в различных функций).

Я хочу добавить IsSet для всех переменных перед назначением

$list['name'] = isset($obj->name)?$obj->name:''; 
$list['desc'] = isset($obj->desc)?$obj->desc:''; 

можно сделать, используя поиск по регулярному выражению и замена это возвышенное? Или есть ли другой лучший способ сделать это быстро, чем делать это вручную?

ответ

2

Что-то такое, как это может работать:

Find Строчка:

^(.*\] = {1,2})(\$obj->\w+[^;]); 

Заменить Строчка:

\1isset(\2)?\2:''; 

Пример:

https://regex101.com/r/ZQbAp0/1

^ asserts position at start of a line 

1st Capturing Group (.*\] = {1,2}) 
.* matches any character (except for line terminators) 
\] matches the character ] literally (case sensitive) 
= matches the characters = literally (case sensitive) 
{1,2} Quantifier — Matches between 1 and 2 times, as many times as possible, giving back as needed (greedy) 

2nd Capturing Group (\$obj->\w+[^;]) 
\$ matches the character $ literally (case sensitive) 
obj-> matches the characters obj-> literally (case sensitive) 
\w+ matches any word character (equal to [a-zA-Z0-9_]) 
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy) 
Match a single character not present in the list below [^;] 
; matches the character ; literally (case sensitive) 
+0

Awesome. Это точно работает так, как я хотел.Но можете ли вы сделать мне еще одну услугу? Я хочу найти '$ array_name ['array_key'];' и заменить его на 'isset ($ array_name ['array_key'])? $ Array_name ['array_key']: '';' Я пытался изменить регулярное выражение для достижения что и все еще пытаюсь. Но если у вас есть ответ, это сэкономит много времени. Еще раз спасибо :) – siddiq

+0

Это должно быть довольно легко, хотя '$ array_name' всегда тот же префикс, что и с' array_key'? поэтому 'array' будет соответствовать в обоих местах. В принципе, это будет найти шаблон '\ $ (. +) (_ Name \ [') (\ 1) (_ key' \];)' и заменить 'isset (\ 1)? \ 1: '';' ... –

+0

Я действительно согласен с вашим ответом. Но мой ключ массива динамичен, и он большой. Это синтаксический анализ xml-элементов массива. Поэтому мой элемент массива выглядит как '$ tag_detail ['/ product-biitem/association-ends [1]/association-end [1]/target [1]/reference-to-product-contract [1]/product-contract- key [1]/object-id [1] ']. Мне нужно добавить isset для этого типа элемента массива. Спасибо за Ваш ответ. что помогло мне в некоторых других случаях. Если это какой-то простой материал, это мне очень помогло бы. ;) :) – siddiq

1

Я был не-программирует подход, чтобы сделать это, без регулярных выражений:

Sublime Text 3 имеет Multiple Selections, чтобы позволить вам редактировать несколько линий в то же время. Чтобы использовать его, просто выберите строки, которые вы хотите отредактировать, и нажмите Ctrl + Shift + L.

Давайте делать трюк:

  1. Выберите 1000 строк, которые Вы хотите редактировать. Нажмите Ctrl + Shift + L, чтобы ввести несколько вариантов. Это выглядит следующим образом:

    enter image description here

  2. Нажмите End, чтобы идти до конца выделенных линий.

  3. Используйте Ctrl + Arrows и Ctrl + Shift, чтобы выбрать $obj->name. Не забудьте использовать Ctrl + Arrows, чтобы вы могли выбрать правильный $obj->xxxxx независимо от длины слова.

  4. Нажмите Ctrl + c чтобы скопировать их.

  5. Перейти к левой стороне $obj->name и введите isset(. Идите вправо и введите )?.
  6. Ctrl + v, чтобы вставить все копии в соответствующие строки.
  7. Нажмите End и введите :''; в конец.

И все готово! Вот результат: enter image description here