Проблема с незакрытым тегом img

данные представлены в формате HTML и отправлены на сервер, который выполняет некоторую предварительную обработку.

Он работает с атрибутом «src» тега «img».

После предварительной обработки и сохранения все предварительно обработанные теги «img» не закрываются самостоятельно.

Например, если бы тег «img» был следующим:

<img src="image.png" />

после предварительной обработки с помощью Nokogiri или Hpricot это будет:

<img src="/preprocessed_path/image.png">

Код довольно прост:

doc = Hpricot(self.content)
doc.search("img").each do |tag|
  preprocess tag
end
self.content = doc.to_html

Для Нокориги это выглядит так же.

Как решить эту проблему?


Обновление 1

Забудьте упомянуть - у меня есть страница HTML 5, которую я пытаюсь проверить с помощью W3C Validator.

Когда тег «img» находится внутри div, он жалуется на следующее:

required character (found d) (expected i)
</div>

Например, попробуйте проверить следующий код:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8" />
</head>
<body>
    <div>
        <img src="image.png">
    </div>
</body>
</html>

Вы получите ту же ошибку:

Line 9, Column 4: required character (found d) (expected i)
</div>

person AntonAL    schedule 18.11.2010    source источник
comment
В функции предварительной обработки, которой вы делегируете полномочия, у вас нет контроля над каждым тегом img? Не можете ли вы вернуть то, что уже возвращено, и добавить явный закрывающий тег </img>?   -  person Macy Abbey    schedule 19.11.2010
comment
Конечно, я могу разобрать все вручную, используя сложные регулярные выражения и т. д. Но эта задача должна решаться библиотекой, я использую   -  person AntonAL    schedule 19.11.2010


Ответы (2)


Я думаю, что проблема связана с вашим тегом <html>, где он объявляет атрибут XMLNS как "XHTML". Кажется, что это противоречит тому факту, что это не документ XHTML. Если вы удалите этот атрибут XMLNS, он должен быть действительным.

<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8" />
  <title>something here</title>
</head>
<body>
  <div>
    <img src="image.png">
  </div>
</body>
</html>
person Peter Brown    schedule 19.11.2010
comment
Ой ну спасибо! Я совсем забыл об этом пространстве имен. Это осталось после копипаста, что было сделано много месяцев назад. - person AntonAL; 19.11.2010

Проблема в том, что ваши библиотеки генерируют правильный HTML, а конечный "/" неверен в HTML.

Если вы не обслуживаете application/xhtml+xml, нет никакого смысла держать его там вообще. Тег IMG является самозакрывающимся во всех версиях HTML, а символ «/» не имеет смысла.

Если вы обслуживаете application/xhtml+xml, я думаю, вам нужно явно использовать to_xhtml Нокогири.

person Chuck    schedule 18.11.2010
comment
@AntonAL: Итак, вы используете XHTML вместо HTML. Как я уже сказал, в этом случае вам нужно будет генерировать XHTML вместо HTML. Или используйте HTML. Вам просто нужно выбрать один и придерживаться его. - person Chuck; 19.11.2010