Комментарии 80
Во, недавно столкнулся с такой же проблемой, будет очень интересно узнать кто как лечит :)
В вашу среду разработки не встроен Tidy ? Во-вторых, есть плагин для фаерфокса, тот же Tidy. https://addons.mozilla.org/en-US/firefox…
Можно не допускать такого: htmlpurifier
вообще это весьма нетривиальная задача — анализ и транслирование кода. у меня в институте чуть мозг не взорвался, когда учили компиляторы писать. еслиб все было так просто, то движки браузероы сами бы закрывали незакрытые теги.
Найти незакрытый тэг так же просто как найти незакрытую скобку в математическом выражении. Принцип тот же, и математиком быть необязательно.
Случилось так, что я - математик. У меня даже диплом есть. И вот что я скажу - понять, что в математическом выражении не хватает скобки не сложно. Но вот найти где именно это скобка должна стоять - очень сложная задача.
По-моему, задачу авто-закрытия тэгов вы сами и придумали.
Слив защитан? Или будет еще какая-нибудь нелепая версия?
Без всякого сарказма, просто просветите нас, как относится "нетривиальная задача — анализ и транслирование кода" к проблеме топика: "когда нужно просто найти незакрытые теги".
Вас, это кого? Тех, кто так легко и играюче рассуждает о математических выражениях? Попробую.
Все очень просто. Есть код html (xml, css, разное), который написал верстальщик. Есть посетитель сайта, которому пришел этот код в виде текста. Есть браузер, который АНАЛИЗИРУЕТ и ТРАНСЛИРУЕТ код в виде, например, таблицы фотографий с голыми бабами на экране монитора.
Так вот. Браузеру нужно понять текст, который написал верстальщик и корректно его отобразить. А это сложно. А сложно на научном языке и значит НЕТРИВИАЛЬНО.
Кажется, я все объяснил. Большими буквами выделены ключевые слова из твоего вопроса.
Все очень просто. Есть код html (xml, css, разное), который написал верстальщик. Есть посетитель сайта, которому пришел этот код в виде текста. Есть браузер, который АНАЛИЗИРУЕТ и ТРАНСЛИРУЕТ код в виде, например, таблицы фотографий с голыми бабами на экране монитора.
Так вот. Браузеру нужно понять текст, который написал верстальщик и корректно его отобразить. А это сложно. А сложно на научном языке и значит НЕТРИВИАЛЬНО.
Кажется, я все объяснил. Большими буквами выделены ключевые слова из твоего вопроса.
Нетривиально - это значит нестандартным, не очевидным способом, пускай и легким по исполнению.
Вот только что нетривиального в обычном анализаторе лексем написанным в 3 строчки на любом скриптовом языке, я как и видимо тов. denver понять увы не могу...
А задачу авто-закрытия тегов броузерами вы сами и придумали.
Вот только что нетривиального в обычном анализаторе лексем написанным в 3 строчки на любом скриптовом языке, я как и видимо тов. denver понять увы не могу...
А задачу авто-закрытия тегов броузерами вы сами и придумали.
Так разве в последнем параграфе топика не ставится эта задача?
Я в своем комменте и пишу, что очень трудно сделать такую утилиту, чтоб она искала такую с первого взгляда простую вещь, как незакрытый тег. А уже потом свели разговор, в русло: "А что сам браузер не исправляет эту ошибку налету?"
И вот на этой грустной ноте нерешенной проблемы обращаюсь к вам, хабралюди. Какими средствами вы пользуетесь, когда нужно просто найти незакрытые теги, но не нужно (пока-что) отвлекаться на всяческие незаданные alt'ы для картинок и прочие менее критические ошибки?
Я в своем комменте и пишу, что очень трудно сделать такую утилиту, чтоб она искала такую с первого взгляда простую вещь, как незакрытый тег. А уже потом свели разговор, в русло: "А что сам браузер не исправляет эту ошибку налету?"
Математик, представь что тэги это разные скобки - закрывающиеся и открывающиеся:
( ... { ... } ... [ ... { ... ] ... ( ...
Иди начиная слева направо и считай скобки. В каком порядке они открываются в таком и должны закрываться. Достаточно ≤1 прохода, чтобы определить скобку которая была не закрыта.
Когда поймешь принцип, замени скобки на тэги. Надеюсь это не подорвет твой мозг.
( ... { ... } ... [ ... { ... ] ... ( ...
Иди начиная слева направо и считай скобки. В каком порядке они открываются в таком и должны закрываться. Достаточно ≤1 прохода, чтобы определить скобку которая была не закрыта.
Когда поймешь принцип, замени скобки на тэги. Надеюсь это не подорвет твой мозг.
Я извиняюсь ч то вмешиваюсь в чужое обсуждение, но...
Теги, например , очень часто бывают вложены друг в друга. Будем считать их за круглые скобки.
Тогда ((()) может быть исправлено и как ()(()) и как ((())). Алгоритм исправления недетерминирован для HTML.
Если имелись ввиду различные тэги, то они могут и пересекаться, напр. , так что пример не понятен.
Теги, например , очень часто бывают вложены друг в друга. Будем считать их за круглые скобки.
Тогда ((()) может быть исправлено и как ()(()) и как ((())). Алгоритм исправления недетерминирован для HTML.
Если имелись ввиду различные тэги, то они могут и пересекаться, напр. , так что пример не понятен.
Исправлять будет человек.
Задача состоит в том, чтобы _найти_.
Для этого достаточно простенького рекурсивного парсера.
Задача состоит в том, чтобы _найти_.
Для этого достаточно простенького рекурсивного парсера.
Приведу контрпример нерекурсивной структуры:
<u><b>Hello, World!</u></b>
Можно локализовать ошибку рекурсивным парсером (выполнять до тех пор пока на границах передаваемого отрезка есть два парных тега).
Я правильно понял твою мысль? Тогда собственно дело за реализацией. Никаких конкретных решений предложить не могу, сам я программист и верстку делаю только базовую (шаблоны). Если появится время, напишу программку на PHP.
<u><b>Hello, World!</u></b>
Можно локализовать ошибку рекурсивным парсером (выполнять до тех пор пока на границах передаваемого отрезка есть два парных тега).
Я правильно понял твою мысль? Тогда собственно дело за реализацией. Никаких конкретных решений предложить не могу, сам я программист и верстку делаю только базовую (шаблоны). Если появится время, напишу программку на PHP.
а вы скобки в стек FIFO пихайте, тогда такого не будет :)
Мдааа... и главно так уверенно (и в тот же момент неправильно в корне) на эту тему рассуждаешь. Тебе бы в политики податься.
должен с вами не согласиться. про конструктивность критики писали не раз наверное, поэтому посторяться не буду.
излагаю здесь некоторые аспекты, которые, возможно, послужили причиной вашего недовольства. итак, на самом деле, существует стандарт по коррекции кода браузерами. именно благодаря ему мы можем видеть что-либо на неправильно написанной странице. не вдаваясь в недостатки этого стандарта, хотелось бы указать, что автора интересует валидация кода (который вполне может быть синтаксически верен), с условием сохранения первоначальной верстки, т.е. совершенно недостижимая таким образом цель.
из сложившегося положения я вижу единственный выход - отслеживание истории. точно описать алгоритм я пока что не берусь, однако определенно надо рассматривать некоторую разновидность деревьев кода и вести по ним историю.
извиняюсь за чрезмерно утомительное сообщение и что продолжил нить рассуждения denver'а. было весьма обидно за товарища по профессии.
излагаю здесь некоторые аспекты, которые, возможно, послужили причиной вашего недовольства. итак, на самом деле, существует стандарт по коррекции кода браузерами. именно благодаря ему мы можем видеть что-либо на неправильно написанной странице. не вдаваясь в недостатки этого стандарта, хотелось бы указать, что автора интересует валидация кода (который вполне может быть синтаксически верен), с условием сохранения первоначальной верстки, т.е. совершенно недостижимая таким образом цель.
из сложившегося положения я вижу единственный выход - отслеживание истории. точно описать алгоритм я пока что не берусь, однако определенно надо рассматривать некоторую разновидность деревьев кода и вести по ним историю.
извиняюсь за чрезмерно утомительное сообщение и что продолжил нить рассуждения denver'а. было весьма обидно за товарища по профессии.
очень легко ты тему поменял. я-то писал о том, что трудно найти место где тег должен быть закрыт:
а про бредовость твоего подхода тебе уже выше за меня ответили.
Случилось так, что я - математик. У меня даже диплом есть. И вот что я скажу - понять, что в математическом выражении не хватает скобки не сложно. Но вот найти где именно это скобка должна стоять - очень сложная задача.
а про бредовость твоего подхода тебе уже выше за меня ответили.
если бы было так, то закрывающие теги были бы не нужны.
всмысли? при чем здесь стандарт? мы тут вроде мечтать собрались о классах скобок! :)
...Разница между математиком и программистом в том, что математик
делает то, что можно, так, как нужно, в то время как программист
делает то, что нужно, так, как можно...
делает то, что можно, так, как нужно, в то время как программист
делает то, что нужно, так, как можно...
Задачу можно решить значительно проще.
Можно просто закидывать открывающие теги в стек, а при попадании на закрывающий тег проверять лежит ли на вершине стека такой же открывающий. если да, то убирать этот тег с вершины стека и идти дальше, если нет, то сообщать об ошибке.
Ваш метод значительно более общий - проверка на соответствие формальной грамматике, хотя это тоже не ахти как сложно.
Вопрос, есть ли для HTML общепринятая формальная грамматика?
Можно просто закидывать открывающие теги в стек, а при попадании на закрывающий тег проверять лежит ли на вершине стека такой же открывающий. если да, то убирать этот тег с вершины стека и идти дальше, если нет, то сообщать об ошибке.
Ваш метод значительно более общий - проверка на соответствие формальной грамматике, хотя это тоже не ахти как сложно.
Вопрос, есть ли для HTML общепринятая формальная грамматика?
как я поступаю, если рушится верстка...
открывается код страницы с ошибкой, и уже в ней для начала считаю все
открывается код страницы с ошибкой, и уже в ней для начала считаю все
А если я не закрою тэг, то шаблон не загрузится.. и упадёт с ошибкой ;)
Обычно использую firebug, ищу область, в которой глючит, и вычисляю "неправильные" теги. Но для этого нужно знать каждую страницу вплоть до блока.
юзать w3c-валидатор и писать код валидный код без ошибок. Со временем привыкаешь.
Есть плагин для ФФ View Source Chart, без неё нереально вообще смотреть большой HTML код. Обычно с помощью этого и нахожу ошибки и незакрытые теги. НО всё равно надо делать валидный код, как никак стандарт, к тому же если подгонять всё под какой то броузер, вы никогда не узнаете как это будет выглядеть в будущих версиях браузеров, а так есть надежда (на МС)что в будущем все броузеры будут поддерживать стандарты. И я вообще фанат Оперы, но без ФФ и его плагинов тяжело, буду ждать от Опера штуки для веб разработчиков. Удачи.
Как было сказано выше - CVS/SVN. Это значительно облегчает поиск ошибки и главное - исправить результат.
"За это время были залиты изменения в десятки, а то и сотни файлов. И начинается кропотливый поиск."
А вот это абсолютно неверное решение. Разбейте задачу на мелкие подзадачи, и тестируйте после выполнения каждой.
"За это время были залиты изменения в десятки, а то и сотни файлов. И начинается кропотливый поиск."
А вот это абсолютно неверное решение. Разбейте задачу на мелкие подзадачи, и тестируйте после выполнения каждой.
Пользуюсь Intellij IDEA.
Парсит все на лету: html, css, js файлы и проверяет их валидность.
Очень порадовало, что требует от HTML быть просто HTML, а не XML: не закрытые input, br таги считаются валидными.
Думаю, такая же ситуация и с Eclipse.
Парсит все на лету: html, css, js файлы и проверяет их валидность.
Очень порадовало, что требует от HTML быть просто HTML, а не XML: не закрытые input, br таги считаются валидными.
Думаю, такая же ситуация и с Eclipse.
Не претендую на звание проффессионального или около-проффесионального верстальщика, но работаю под KDE в основном в Quanta+. Она обычно сама закрывает теги, где надо и не надо. При грамотной настройке эта функция бывает весьма полезной. Особенно если приучиться сначала открыть-закрыть тег, а потом уже вписывать в него данные.
Мне кажется что организовать эффективную распределённую работу 16 человек над одним кодом без систем контроля версий а-ля SVN/CVS очень сложно. При наличии версий можно хоть каждую версию протестировать в ходе временного промежутка, а дальше уже задача на bugfix вешается на автора опуса и к дисциплине приучает и пустой траты времени практически нет.
в моей cms все шаблоны написаны на xslt, так что за корректностью html следит xslt-процессор
Я код правлю в Dreamweaver'e, там есть такая мулька аналитическая - CLOSE TAGS.
В 99% случаев помогает.
В 99% случаев помогает.
Пользуюсь HTML валидатором https://addons.mozilla.org/firefox/addon/249
На development сервере прописано
header('content-type: application/xml; charset=utf-8', true);
Мозилла и опера сразу показывают ошибки верстки с номером строки и символом.
header('content-type: application/xml; charset=utf-8', true);
Мозилла и опера сразу показывают ошибки верстки с номером строки и символом.
как вариант загрузить (x)html в DOMDocument и смотреть не выдает ли он варнингов, и использовать Validates the document based on its DTD
DTD именно для этого и предназначен, или я ошибаюсь?
Ну и конечно проверка на валидность встроенна в PDT
DTD именно для этого и предназначен, или я ошибаюсь?
Ну и конечно проверка на валидность встроенна в PDT
поиск любых ошибок надо начинать в первую очередь с синтаксической строгости документа. ставите HTML Validator для FF и всегда видите статус строгости документа.
Очевидно, что нужно использовать SVN или CVS. Сразу будет видно, что, когда, кем, в каком файле было изменено. А когда видны изменения, то несложно найти ошибку - не нужно прочесывать весь код, нужно только проверить измененные места.
Аналогично, первая мысль: проанализировать разницу между снимками кода.
Согласен, SVN - наше все. Но когда ошибка внезапно находится через неделю-две после злосчастного commit’а (да-да, бывает и так на редкопосещаемых страницах или при каких-нибудь специфических условиях), сложно вычислить последний.
Андрюха привет.
Та что там Сыроежин сказал, как он это делает?
Dreamweaver кстати может помочь, но поскольку юзаеться большое количество фримаркера, то варнингов будет тож достаточно много. Я юзаю Tidy, прогребать надо много ерроров и варнингов, но зато хоть есть хоть какой-нибудь список. Валидно версать вряд ли получиться - всё на шаблонах да и рефакторинг существующиего кода займёт достаточно много времени, к тому же полюбому надо будет садить возле себя сервис разработчика.
Та что там Сыроежин сказал, как он это делает?
Dreamweaver кстати может помочь, но поскольку юзаеться большое количество фримаркера, то варнингов будет тож достаточно много. Я юзаю Tidy, прогребать надо много ерроров и варнингов, но зато хоть есть хоть какой-нибудь список. Валидно версать вряд ли получиться - всё на шаблонах да и рефакторинг существующиего кода займёт достаточно много времени, к тому же полюбому надо будет садить возле себя сервис разработчика.
Самый правильный способ, это писать теги сразу парами.
За три года проблем с незакрытыми тегами у меня не возникало.
За три года проблем с незакрытыми тегами у меня не возникало.
как вариант можно открыть в dreamweaver и сворачивать все валидно-закрытые тэги начиная с самых глубоких( я надеюсь древовидные отступы вы ставите?)так ошибку самому можно найти довольно быстро
Quimby походу писал о том же но я например с его слов не понял бы :)
Quimby походу писал о том же но я например с его слов не понял бы :)
firefox+tidy неплохо справляется с задачей поиска пары выпавших дивов, так же присутствует подавление определенных ошибок, firebag позволяет проконтролировать правильные ли стили применены к объекту.
коменты не читал, но в VS есть подсветка синтаксиса с валидацией, главное доктайп указать
Все что тут написано - по большей части верно. Но когда вы занимаетесь разработкой Web 2.0 проекта в команде из 5-15 человек, то автоматическая валидация документов средствами IDE, валидатор W3C, Dreamwaver часто не спасает. Происходит это потому, что программист Пупкин захадкодил некорректный HTML в JavaScript-е, а браузеры автоматически закрывают незакрыетые теги, причем иногда корректно - иногда и нет.
Грузите куда хотите. Хоть в "ДримВейвер", хоть еще куда. Но не забывайте о том, что один и тот же тег в коде может закрываться в нескольких местах по условию. И как в этом случае проверить?
ЗЫ. Или я что-то не догоняю в воскресенье утром? ;)
ЗЫ. Или я что-то не догоняю в воскресенье утром? ;)
Вы будете смеяться, но последний раз когда у меня была проблема с незакрытым тегом меня спас... FAR Manager с плугином colorer. Он автоматически валидирует _синтаксис_, т.е. проверяет что бы количество открытых тегов совпадало с количеством закрытых, если нет - подсвечивает как ошибку не закрытый тег.
Обычно работаю в ZDE, но иногда удобно посматривать и фаром.
Обычно работаю в ZDE, но иногда удобно посматривать и фаром.
FAR + colorer5, только в схеме htc\common.jar:/inet/html.hrc нужно немного подправить htmlPairs (добавив туда теги div, span, td, tr...), после чего можно просто прыгать по парам ища что-то невалидное.
то есть тебе нужно просто вместо XHTML-валидатора использовать XML-валидатор
Валидатор в редакторе кода (Dreamweaver. Aptana/Eclipse) позволяет творить валидацию на лету, да еще и фильтровать ошибки/ворнинги/инфо. Полюбому, справляться надо с первыми двумя надо «под ноль».
Для нахождения и исправления таких вещей в XML и HTML я использую Altova XMLSpy (http://www.altova.com/products/xmlspy/xm…). Там есть функция "Pretty Print", которая
выравнивает документ и ругается, если где-то что-то не так (при этом говоря, чего и где не хватает)
выравнивает документ и ругается, если где-то что-то не так (при этом говоря, чего и где не хватает)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
А закрыл ли ты тег?