Вы забыли второй параметр preg_match. Вы также можете рассмотреть выборку скобок (индекс 1) вместо всего шаблона (индекс 0).
$url = file_get_contents($source);
preg_match('/([0-9]{9})/', $url, $match);
echo $match[1];
Я думаю, что причина, по которой вы получаете <
, заключается в том, что вы уже использовали $ match ранее, и она содержит строку, начинающуюся с <
. preg_match, используемый в вашем вопросе, не изменит $ match, поэтому $ match [0] является первым символом строки, содержащейся в $ match (к строкам можно обращаться как к массивам в PHP).