Все знают, что в административной панели сайта хорошо править контент страниц в визуальном редакторе, который имеет название WYSIWYG. Вот и наш редактор как-то странно себя начал вести, перестал закрывать HTML теги (не все, а те, которые ему хочется). Т.к. JS программист в это время был в отпуске нужно было срочно исправить проблему. Пришлось вставлять костыль в виде скрипта на PHP, которые будет автоматом закрыть все незакрытые теги.
Например корявый код:
<a href="http://artkiev.com">Разработка интернет-магазинов</a> <div><br />Лучшие цены <div><div> на </div> раскрутку <b>и оптимизацию <p>сайтов</b>
После обработки получаем:
<a href="http://artkiev.com">Разработка интернет-магазинов</a> <div><br />Лучшие цены <div><div> на </div> раскрутку <b>и оптимизацию <p>сайтов</b></div></div></p>
Функция:
<?
function close_tags($content)
{
$position = 0;
$open_tags = array();
//теги для игнорирования
$ignored_tags = array('br', 'hr', 'img');
while (($position = strpos($content, '<', $position)) !== FALSE)
{
//забираем все теги из контента
if (preg_match("|^<(/?)([a-z\d]+)\b[^>]*>|i", substr($content, $position), $match))
{
$tag = strtolower($match[2]);
//игнорируем все одиночные теги
if (in_array($tag, $ignored_tags) == FALSE)
{
//тег открыт
if (isset($match[1]) AND $match[1] == '')
{
if (isset($open_tags[$tag]))
$open_tags[$tag]++;
else
$open_tags[$tag] = 1;
}
//тег закрыт
if (isset($match[1]) AND $match[1] == '/')
{
if (isset($open_tags[$tag]))
$open_tags[$tag]--;
}
}
$position += strlen($match[0]);
}
else
$position++;
}
//закрываем все теги
foreach ($open_tags as $tag => $count_not_closed)
{
$content .= str_repeat("</{$tag}>", $count_not_closed);
}
return $content;
}
?>
Пример использования:
$text = close_tags($_POST['body_page']);