Unfortunately that depends entirely on what you are wanting to do.
String replacement is much better performance wise the pattern matching. However, str_replace in sequence will always apply ltr, so first you replace " with nothing, then you replace % with %), then you replace + with nothing. In this particular situation, you can likely get away with a simple:
echo str_replace(array('+', '%', '"'), array('', '%)', ''), $stock);
The thing to be careful with with str_replace is that any replacement you do doesn't impact on the next set (unless that is the intent of course). So if I were to replace + with '%' and '%' with '%)', then every + would become %) when the intent may be to replace it with %.