регулярное выражение для поиска и замены строки в PHP

0

У меня есть такие тексты в файле.txt

rpad(lookup_ext([DM_W1_XREF.DM_W1_XREF.XREF_VKORG_VTWEG, \'PRE_LOAD_CACHE\', \'MAX\'], [ VKORG_NEW ], [  NULL  ], [ SYSTEM_NAME, \'=\', T_M67_A033_EXT.SYSTEM_NAME, VKORG_OLD, \'=\', T_M67_A033_EXT.VKORG ]) 
SET("output_cols_info" = \'<?xml version="1.0" encoding="UTF-8"?><output_cols_info><col index="1" expression="no"/>
</output_cols_info>\', "run_as_separate_process" = \'no\'), 4, \' \')

Я хочу, чтобы они были преобразованы в

nvl(rpad(lookup_ext([DM_W1_XREF.DM_W1_XREF.XREF_VKORG_VTWEG, \'PRE_LOAD_CACHE\', \'MAX\'], [ VKORG_NEW ], [  NULL  ], [ SYSTEM_NAME, \'=\', T_M67_A033_EXT.SYSTEM_NAME, VKORG_OLD, \'=\', T_M67_A033_EXT.VKORG ]) 
SET("output_cols_info" = \'<?xml version="1.0" encoding="UTF-8"?><output_cols_info><col index="1" expression="no"/>
</output_cols_info>\', "run_as_separate_process" = \'no\'), 4, \' \'),'$$$$')

Как я могу сделать это с помощью PHP? вновь добавленные $ должны быть равны числу 4.

Теги:

2 ответа

0
Лучший ответ

Это возможно с помощью функции preg_replace_callback.

$str= <<< EOT
rpad(lookup_ext([DM_W1_XREF.DM_W1_XREF.XREF_VKORG_VTWEG, \'PRE_LOAD_CACHE\', \'MAX\'], [ VKORG_NEW ], [  NULL  ], [ SYSTEM_NAME, \'=\', T_M67_A033_EXT.SYSTEM_NAME, VKORG_OLD, \'=\', T_M67_A033_EXT.VKORG ]) 
SET("output_cols_info" = \'<?xml version="1.0" encoding="UTF-8"?><output_cols_info><col index="1" expression="no"/>
</output_cols_info>\', "run_as_separate_process" = \'no\'), 4, \' \')
EOT;
echo preg_replace_callback("~(?s)rpad\(.*?,\h*(\d+),\h*\\\\'\h*\\\\'\)~", function($m){
    return 'nvl('.$m[0].",'".str_repeat("$", $m[1])."')";
}
    , $str);

Вывод:

nvl(rpad(lookup_ext([DM_W1_XREF.DM_W1_XREF.XREF_VKORG_VTWEG, \'PRE_LOAD_CACHE\', \'MAX\'], [ VKORG_NEW ], [  NULL  ], [ SYSTEM_NAME, \'=\', T_M67_A033_EXT.SYSTEM_NAME, VKORG_OLD, \'=\', T_M67_A033_EXT.VKORG ]) 
SET("output_cols_info" = \'<?xml version="1.0" encoding="UTF-8"?><output_cols_info><col index="1" expression="no"/>
</output_cols_info>\', "run_as_separate_process" = \'no\'), 4, \' \'),'$$$$')
  • 0
    Большое спасибо. его работает: D
0

существует множество способов достижения вашей цели.

Это наиболее просто, регулярное выражение может быть вашим регулярным выражением

rpad(.*?)\\'\s\\\\'\)

И это может быть ваша строка замены

rpad(val\1,'$$$$')

наслаждаться

Ещё вопросы

Сообщество Overcoder
Наверх
Меню