Я думаю, это поможет вам:
$pattern = "|<h2>(.*)</h2>|U";
preg_match_all($pattern,$html,$matches);
foreach($matches[1] as $match)
$html = str_replace($match, "<a name='".$match."' />".$match, $html);
$array_of_elements = $matches[1];
Просто убедитесь, что $ html имеет существующий html до запуска этого кода. После этого к нему будет добавлено <a name='foo' />
, а $ array_of_elements будет иметь массив соответствующих текстовых значений.