$foo = preg_replace('/\[url=([^\s]*)\]\[img(.*?)\]([^\s]*)\[\/img\]\[\/url\]/i', '[img$2]$3[/img]', $foo);
(?!...)
$text = preg_replace(
'#\[url=(?!https?://site\.ru)\S*\](\[img.*?\]\S*\[/img\])\[/url\]#i',
'$1',
$text
);
$white_list = ['site3.ru', 'site4.ru'];
$text = '
[url=https://site1.ru/page][img]https://site1.ru/file.jpg[/img][/url]
[url=https://site2.ru/page][img]https://site2.ru/file.jpg[/img][/url]
[url=https://site3.ru/page][img]https://site3.ru/file.jpg[/img][/url]
[url=https://site4.ru/page][img]https://site4.ru/file.jpg[/img][/url]
';
$text = preg_replace_callback(
'#\[url=(\S*)\](\[img.*?\]\S*\[/img\])\[/url\]#i',
function ($m) use($white_list) {
$host = parse_url($m[1], PHP_URL_HOST);
if (in_array($host, $white_list))
return $m[0];
return $m[2];
},
$text
);