Как бы окуратно я не кодил, мой движок при выводе превращает все в фрагментарную кашу... Когда начинаешь разбирать вывод - можно повеситься! Поэтому я решил написать функцию, которая форматирует вывод - точнее просто расставляет "сдвиги" строчек. Возможно это не лучшая реализация, но по другому я еще не умею ))) Попутно снабдил ее несколькими фичами: - режим "сворачивать все в "кашу" - типа защита от краж, не сильная, но что бы разобрать код - придется подумать. Немного уменьшает общий вес страницы и экономит трафик. - можно включить подсчет парных тегов, т.е. скрипт тупо показывает равно ли кол-во открытых тегов - кол-ву закрытых Синтаксис примерно такой: out_format(str buffer,[int mode]); buffer - исходный HTML текст mode - режим: 0 (по умолчанию) - сворачивает в кашу 1 - красиво форматирует 2 - красиво форматирует и выводит отчет Возвращает отформатированный текст. Буду рад, если кому пригодится! ))) Если кто то ее модернизирует в плане производительности/ресурсоемкости - скажу спасибо! ))) Замечания и критику пишите в ветку! PHP: function out_format($buffer,$fdebug=0) { // // Форматизатор вывода by S.t.A.M. ver. 1.01 // switch ($fdebug) { case 0: $patern = "/(^\s*)|(\r)|(\n)/m"; $result = preg_replace($patern, '', $buffer); break; case 1: case 2: $buffer = str_replace("<br>","<br>\r",$buffer); $patern = "/^\s*/m"; $buffer = preg_replace($patern, '', $buffer); $open_tags_array = Array("<html", "<head", "<title", "<body", "<p", "<a", "<div", "<table", "<tr", "<th", "<td", "<caption", "<frameset", "<ol", "<ul", "<menu", "<form", "<textarea", "<select", "<script"); $close_tags_array = Array("</html>", "</head>", "</title>", "</body>", "</p>", "</a>", "</div>", "</table>", "</tr>", "</th>", "</td>", "</caption>", "</frameset>", "</ol>", "</ul>", "</menu>", "</form>", "</textarea>", "</select>", "</script>"); $check = array_fill(0,count($open_tags_array),0); $buffer_arr_t = explode("\r",$buffer); $count=0; $ident=" "; // отступ определяется кол-вом пробелов! foreach ($buffer_arr_t as $val) { if (trim($val)!="") { $cur_count = $count; $x_open = 0; foreach ($open_tags_array as $ind => $pat) { $tmp = preg_match_all("/$pat( |>)/i",$val,$out); $x_open += $tmp; if ($fdebug==2) { if ($tmp>0) {$check[$ind] += $tmp;} } } $x_close = 0; foreach ($close_tags_array as $ind => $pat) { $pat = str_replace("/","\/",$pat); $tmp = preg_match_all("/$pat/i",$val,$out); $x_close += $tmp; if ($fdebug==2) { if ($tmp>0) {$check[$ind] -= $tmp;} } } $count += ($x_open-$x_close); $move = ($x_open-$x_close<0)?$count:$cur_count; $tmp_str = str_repeat($ident,$move).trim($val); $buffer_arr[] = $tmp_str; } } $buffer = implode("\r",$buffer_arr); if ($fdebug == 2) { $buffer .= "\r\r\r<!-- \r ОТЧЕТ: \r"; foreach ($open_tags_array as $ind => $val) { $hint = ($check[$ind]==0)?"":" <<<------------------- ОШИБКА!!!"; $buffer .= $val."> = ".$check[$ind].$hint."\r"; } $buffer .= "\r* <0 кол-во лишних закрывающих тегов,\r* >0 кол-во лишних открывающих тегов.\r-->"; } $result = $buffer; break; } return $result; }
Опасная штука для производительности. Лучше подключить опцией в редакторе шаблонов и просто форматировать текст страницы.
Digger Форматирование используется только во время отладки, так что можно потерпеть... А потом можно перевести в режим "в кашу" и тогда одна замена по регулярке не сильно загрузит систему. Горбунов Олег Прости, не понял, что ты хотел этим сказать... P.S. Чуть оптемизировал код. Up!
Горбунов Олег +1. Когда открыл для себя Firebug перестал форматированием вывода заморачиваться. И баги косяки верстки стали быстрее находиться.
Разработчик выбирает инаструменты, а не они его. "Сижу" я тоже на Опере. А ФФ - это инструмент. Крайне удобный.
S.t.A.M., попробуй поставить FireFox и на него Firebug и почувствуешь мега комфорт))) Возможность посмотреть и включить/выключить любую из деклараций селектора, прикольная коносоль(особенно я ею проникся за то, что она AJAX(Post/Get запросы записывает и можно просмотреть что там от скрипта пришло и почему не срабатывает) ну и многое многое другое. P.S. У меня знакомый сидит на Маковском браузере, но все равно юзает Firebug через Firefox... Ибо удобно...