067 607 57 84
МЕНЮ

PHP - автоматичне закриття всіх відкритих HTML тегів

Створення сайтів Львів

Всі знають, що в адміністративній панелі сайту добре правити контент сторінок в візуальному редакторі, який має назву WYSIWYG. Ось і наш редактор якось дивно себе почав вести, перестав закривати HTML теги (не всі, а ті, які йому хочеться). Оскільки JS програміст в цей час був у відпустці потрібно було терміново виправити проблему. Довелося вставляти милицю у вигляді скрипта на PHP, які буде автоматично закрити всі незакриті теги.

Наприклад кривий код:

<a href="http://site.com"> Розробка інтернет-магазинів </a> <div><br /> Кращі ціни <div><div> на </div> розкрутку <b> і оптимізацію <p> сайтів </b>
                   

Функція:

<?
   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']);