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

У меня есть такие тексты в файле .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,'$$$$') 

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