Там где появился один тег который нельзя срезать - появится и другой. Я бы взял подконтроль что срезать, а что нет через preg_replace_callback:
$txt = 'one [gallery type="carrousel"] two [product id="1"] three [store name="phone"] four';
$result = preg_replace_callback('/\[.*?\]/usS', function ($tag) {
if (stripos($tag[0], "[store ") === false) {
return '';
} else {
return $tag[0];
}
}, $txt);
var_dump($result); // string(41) "one two three [store name="phone"] four"
Регуляркой не обрабатывается случай когда ] будет в строке тега — [gallery type="injection]"]. Тут будет кривизна, надо улучшить регулярку. Но самый надженный способ избежать иньекции скобок - парсить через токенайзер
token_get_all, это посложнее реализовать, но проще обрабатывать такие edge-случаи.