Вероятно, у ваших шаблонов самые большие проблемы из-за их жадного и ленивого характера. Изменение на следующее должно решить эту проблему ...
preg_match_all('#<h3.*?><a href="(.*?)".*?</h3>#', $result, $matches);
print_r($matches[1]);
Возможно, есть несколько редких URL, которые могут испортить шаблон, но есть вероятность, что вы не столкнетесь с одним из них. Я укажу, что все еще есть хорошая точка зрения, хотя использование API было бы лучшим вариантом.
Что касается людей, которые в общих чертах отвечают «Вы не можете анализировать HTML с помощью Regex, используйте DOM» ... Хотя вы не можете создать универсальный анализатор HTML (и должны использовать DOM для этой задачи), вы можете сопоставлять шаблоны в известном наборе текста следует определенная структура, тот факт, что структура является HTML, не имеет значения. Да, если Google изменит свой макет, он, вероятно, сломается, но это также, вероятно, верно и для DOM Parser. (П.С. Я хорошо знаю, что, возможно, овцы проголосуют против этого).