У меня есть такие тексты в файле .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.
Это возможно с помощью функции 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, \' \'),'$$$$')
существует множество способов достижения вашей цели.
Это наиболее просто, регулярное выражение может быть вашим регулярным выражением
rpad(.*?)\\'\s\\\\'\)
И это может быть ваша строка замены
rpad(val\1,'$$$$')
наслаждаться