html = $this->HeadBodyMerge($html); } public function Get() { return $this->html; } /** * Убирает вложенные head-ы */ private function DeleteInnerHtml($html) { preg_match('~~is', $html, $m); if (!isset($m[0])) { return $html; } $headAttrs = isset($m[1]) ? $m[1] : ''; // Атрибуты главного head-а если были $html = $m[0] === '' ? $html : str_ireplace($m[0], '', $html); // Заменяем первый head с атрибутами на обычный что бы проще было искать do { $open = stripos($html, '') + strlen(''); $end = stripos($html, '', $open); // Ищем где он закрывается $head = substr($html, $open, $end - $open + strlen('')); // Берём этот подконтент // Есть ли в этом контенте подхеад? $open2 = strripos($head, ''); $end2 = $open2 + strlen(''); if ($open2 !== false) // Если есть то он уже в хеаде, потому убираем его { $headWithoutSub = substr($head, 0, $open2) . // От начала head до того где в нём нашли вложеный head substr($head, $end2, strlen($head) - $end2 - strlen('')); $html = str_ireplace($head, $headWithoutSub, $html); } } while ($open2 !== false); // Если в контенте все еще есть открывающийся head return _StrReplaceFirst('', "", $html); } /** * Сливает несколько разделов head в 1 */ private function HeadBodyMerge($html) { $html = $this->DeleteInnerHtml($html); preg_match_all('~(.*?)~is', $html, $m); // Если ... больше чем 1 тогда имеет смысл их объединять if (count($m[0]) > 1) { // Собираем общий head $head = '' . implode('', array_filter(array_unique($m[2]))) . ''; // Заменяем все ... на 1 слитый $html = str_replace($m[0][0], $head, $html); $html = str_replace(array_splice($m[0], 1), '', $html); } return $html; } }; ?>