Попробуйте,
preg_match( '/\bhttp\S*pdf\b/', $html, $matches );
Вам нужно сопоставить часть между http
и pdf
, это то, что делает .*?
.
^
соответствует началу строки и $
концу, но это не то, что вам нужно, когда вы хотите извлечь эти ссылки из более длинного текста.
\b
соответствует границам слова
Обновление
для полноты, .*?
будет по-прежнему слишком много совпадать, поэтому при обмене на \S*
\S
соответствует непробельный символ