If you just want to get money off, you don't need to use preg_replace. You can capture using preg_match instead:
$string = '$10 off 5, 10 and 15mb hosting offer';
preg_match('#\$(\d+ off)#', $string, $match);
echo $match[1]; // output: 10 off
Granted, if you might have decimals as well, say $15.95 off, you can use this:
$string = '$15.95 off 5, 10 and 15mb hosting offer';
preg_match('#\$(\d+(?:\.\d+)? off)#', $string, $match);
echo $match[1]; // output: 15.95 off
In that last example, the decimal and numbers afterwards are optional. So it would match $15 off by example as well as a dollar figure with a decimal and cents.