Закрыть незакрытые тэги
Четверг, 30 апреля 2009
Функция позволяет закрыть незакрытые HTML-тэги.
function closetags($html) {
$single_tags = array('meta','img','br','link','area','input','hr','col','param','base');
preg_match_all('~<([a-z0-9]+)(?: .*)?(?<![/|/ ])>~iU', $html, $result);
$openedtags = $result[1];
preg_match_all('~</([a-z0-9]+)>~iU', $html, $result);
$closedtags = $result[1];
$len_opened = count($openedtags);
if (count($closedtags) == $len_opened) {
return $html;
}
$openedtags = array_reverse($openedtags);
for ($i=0; $i < $len_opened; $i++) {
if (!in_array($openedtags[$i], $single_tags)) {
if (FALSE !== ($key = array_search($openedtags[$i], $closedtags))) {
unset($closedtags[$key]);
}
else {
$html .= '</'.$openedtags[$i].'>';
}
}
}
return $html;
}
Автор не я. Кто написал не помню…
Комментарии
а насколько правильно он закрывает теги?
Николай
Попробуйте.
Имхо, баловство это. Для XML бы еще прокатило, но для HTML, с его неявным закрытием "пэшек" перед любым блочным тегом и т.п., это мало что меняет. Да и зачем так изворачиваться, когда есть Tidy?
Кстати, список одиночных тегов неполон -- как минимум, есть еще INPUT, HR, COL, PARAM и BASE...
SelenIT
Решение конечно же для закрытия XHTML. Использовано как раз было из-за отсутствия Tidy.
Список одиночных действительно неполон. Добавлю.
Спасибо, как нельзя кстати. Как раз собирался писать такую функцию
Функция позволяет не только закрыть все открытые теги, но и открыть все закрытые которые могут образоваться после вырезания участка кода XHTML из произвольного места.
Тоже не помню где подсмотрел
В регулярке некорректно обработаны обратные слэши, автору скрипта низачод)
Правильно:
спасибо большое за скрипт!
у меня возник вопрос, что если скрипт не в том порядке закроет теги, в случае дивной верски - он может наломать дров, кто его уже пробовал? напишите свои впечатления плиз
Я сделал, что если тег table есть, не обрезать, т.к. это зачастую вёрстку нехило сбивает.
Большое Спасибо за скрипты. Будем тестировать!!!
Оставить комментарий