Одной регуляркой не обойтись, нужен комплексный подход.
<?php
$source = '12[img]http://site[/img]122[img]http://site[/img]3456789[img]http://site[/img]3333';
$limit = 4;
$counter = 0;
$matches = [];
echo $source . PHP_EOL;
preg_match_all('~(?:\[.*\].*\[\/.*\])|(.)~Usu', $source, $matches, PREG_OFFSET_CAPTURE);
foreach($matches[1] as $val) {
if(is_array($val)) {
$counter++;
if($counter == $limit) {
$source = substr_replace($source, '', $val[1] + 1);
break;
}
}
}
echo $source . PHP_EOL;
PS Я так понимаю, это функционал для автоматического ката :)