Это зависит от того, разрешено ли пространство между двоеточиями. Если это не так:
$out = preg_replace('!:([^ ]+):!', '!|$1|!', $in);
в порядке. Вы также можете рассмотреть возможность использования не жадного выражения:
$out = preg_replace('!:(.+?):!', '!|$1|!', $in);
Вот еще один вариант:
$out = preg_replace('!:([^:]+):!', '!|$1|!', $in);