Try adding a question mark to your regular expression
foreach($matches[0] as $key=>$val) {
$price = preg_replace( '/<(.*?)>/', '', $val);
}
This will have the effect of finding the first >
instead of the last one. Regular expressions are greedy and will find everything it can.
Also, keep in mind that the way you are doing this will replace $price with each loop. I am assuming you're doing something with $price before the next loop occurs, but if not, you should store the price in an array.