регулярное выражение: как постобработать результат замены

В моем текстовом редакторе (phpStorm, notepad++, jedit и т. д.) у меня есть такие строки:

....    $this->request_json['store-user-id'] .....
....    $this->request_json['deviceID'] ....

Мне нужно заменить их на:

$this->request->store_user_id
$this->request->device_id

i.e.

search: \-\>request_json\[\"([\w_\-]+)\"\]
replace: ->request->$1

НО: мне нужна дополнительная встроенная замена "-" -> "_", преобразование в нижний регистр и предварение каждой заглавной буквы "_".

Возможно ли это с помощью регулярного выражения в стиле Perl? Может рекурсивный?


person Tertium    schedule 15.01.2015    source источник
comment
В Notepad++ 6.0 или выше вы можете использовать PCRE (Perl-совместимое регулярное выражение) Search/Replace (источник: sourceforge.net/apps/mediawiki/notepad-plus/). Таким образом, вы можете использовать регулярное выражение, например (. )([A-z])(.+), с заменяющим аргументом, например \1\U\2\3.   -  person Stephan    schedule 15.01.2015
comment
Спасибо. Где я могу найти информацию об этих интересных аргументах замены? в блокноте++ ничего нет   -  person Tertium    schedule 15.01.2015
comment
Вместо этого проверьте эту ссылку: letconex.blogspot.fr /2013/06/. См. 9. Substitutions   -  person Stephan    schedule 16.01.2015


Ответы (2)


просто примените эти 4 последовательных замены регулярных выражений к вашим строкам $ txt

$txt =~ s/_json\[\'/->/;
$txt =~ s/']//;
$txt =~ s/([a-z])([A-Z])/\1_\2/g;
$txt =~ tr/[A-Z]/[a-z]/;
person jjpcondor    schedule 15.01.2015
comment
Я работаю с большим php-документом, поэтому замену нужно производить только в найденных подшаблонах. Я ищу способ постобработки результата регулярного выражения. единственный способ, который я вижу сейчас, — это извлечь все найденные строки с помощью preg_match_all, а затем работать с ними с помощью preg_replace, str_replace и strtolower. - person Tertium; 15.01.2015

Наконец решил проблему в php:

$fstr = implode("", file("file_with_text_to_replace.php"));
$rfstr = preg_replace_callback("/\\-\\>request_json\\[(?:\\\"|\\')([\\w_\\-]+)(?:\\\"|\\')\\]/",
             function ($matches)
             {
               //any post-processing
               return  "->request->" . str_replace("-","_", $matches[1]);
             },
             $fstr);

Это самое мощное решение. Я немного потерял связь с php в эти дни, но я очень удивлен, что никто не указал на эту функцию php. Это дает полный контроль над результатом поиска, что невозможно в текстовых редакторах. Великолепно!

person Tertium    schedule 15.01.2015
comment
Вы экранируете слишком много символов, -, >, ' не нужно экранировать, \w уже включает -, а одной обратной косой черты достаточно, чтобы экранировать ", [ и ]. Ваше регулярное выражение станет намного более читабельным. - person Toto; 15.01.2015