Санация HTML в C ++ - PullRequest
       12

Санация HTML в C ++

3 голосов
/ 19 апреля 2009

Существует ли какая-либо доступная функция / класс / библиотека C ++ (или, возможно, C) с единственной целью очистки строки, которая может содержать HTML?

Я нашел много исходного кода для очистки в C # или других языках, более используемого в веб-приложении, но ничего в C ++.

Я попытаюсь реализовать свою собственную функцию, если я не найду ничего доступного, но я думаю, что тщательно протестированное решение будет гораздо лучше.

edit> Еще несколько уточнений по моим потребностям:

Я получаю ввод текста с клавиатуры в моем приложении C ++. Затем мне нужно санировать его перед использованием в качестве параметра при вызове функции javascript. Этот javascript запускается на загруженной html-странице, которая автоматически отображается (через Chromium) в текстуре, которую я отображаю через библиотеку (Navi). Итак, функция javascript, которую я использую, просто возьмет заданный текст, поместит P-тег вокруг текста и вставит его в div следующим образом:

text_display.innerHTML += text_to_add;

Мне нужно очистить текст перед отправкой на веб-страницу, будь то для этой функции или другой. Его просто нужно продезинфицировать перед вводом в Chromium.

Ответы [ 5 ]

6 голосов
/ 19 апреля 2009

HTML Tidy написан на c, но есть привязки практически для каждого языка / платформы, , включая c ++ .

1 голос
/ 24 апреля 2009

Вы задаете довольно вопрос здесь. Прежде чем вы получите хороший ответ, вам необходимо уяснить, что именно вы хотите «проанализировать» из ваших входных данных. Например, вы можете искать любые символы «<» и преобразовывать их во что-то другое, чтобы они не анализировались никаким HTML-анализатором. </p>

Или вы можете найти шаблон <и>, за которым следует шаблон </>. (Извините, я должен был вставить это здесь, чтобы HTML-парсер ЗДЕСЬ не ел его). Затем вам также нужно искать «».

Вы можете действительно искать допустимые / известные теги HTML и удалять их.

Итак, возникает вопрос, какой метод является правильным для вашего решения? Зная, что если вы создаете простой синтаксический анализатор, вы можете фактически скопировать корректный текст, содержащий символы больше и меньше.

Итак, вот мой ответ для вас до сих пор.

Если вы хотите просто УДАЛИТЬ любой текст в стиле HTML, я бы порекомендовал использовать механизм регулярных выражений (PCRE) и использовать его для анализа ввода и удаления всех подходящих строк. Это, вероятно, простое решение, но оно требует, чтобы вы получили и собрали PCRE, и есть проблемы GPL, о которых вам нужно знать, для вашего проекта. Синтаксический анализ, вероятно, будет очень прост в реализации и выполняется быстро.

Второй вариант - сделать это путем обхода буфера, поиска открытого HTML-символа (<), затем синтаксического анализа до тех пор, пока вы не достигнете первого пустого пространства, затем начните ходить, ища закрывающий код HTML (>), затем начните ходить снова, ища соответствующий тег CLOSING, основываясь на том, что вы только что проанализировали. (Скажем, это тег DIV, вы хотите искать /DIV.))

У меня есть код, который делает это в синтаксическом анализаторе STL HTML, но есть много вопросов, которые следует рассмотреть и по этому пути. Например, у вас есть коды сущностей, с которыми можно иметь дело, одноэлементные теги, такие как IMG, P и BR, чтобы назвать несколько.

Если вы хотите, чтобы действительно ДЕЙСТВИТЕЛЬНО был хороший C-код, посмотрите на проект ClamAV. У них есть HTML-парсер, который удаляет все теги со страницы и оставляет вам только оставшийся текст. (среди прочего это делает ..). Посмотрите в файле libclamav \ htmlnorm.c отличный пример «обхода буфера» и анализа. Это не самая быстрая вещь в мире, но она работает ... В последнем Clam может быть даже столько материала, связанного с анализатором HTML, что это может быть трудно понять. Если это так, вернитесь и посмотрите на более раннюю версию, например .88.4 или около того. Просто имейте в виду ошибки в тех старых кодах, есть и хорошие. :)

Надеюсь, это поможет.

1 голос
/ 24 апреля 2009

Вы можете использовать libxml2's xmlEncodeSpecialChars.

0 голосов
/ 29 апреля 2009

Используйте Qt QWebkit и для анализа HTML-дерева. Тогда плевать на выход с этим. Это немного очистит html.

0 голосов
/ 19 апреля 2009

Этот был опубликован несколько часов назад. Это просто статья о регулярных выражениях, но она содержит именно то, что вы хотите :), и я думаю, что этот также может быть интересен.

...