Каков наилучший способ удалить HTML из строки? - PullRequest
3 голосов
/ 29 декабря 2010

Недавно я начал использовать следующий RegEx в функции ReReplace () для удаления тегов HTML из строки с помощью ColdFusion. Обратите внимание: я не использую это в качестве защиты от внедрения XSS или SQL; это только для удаления существующего и безопасного HTML из строки перед ее отображением в атрибуте заголовка HTML.

REReplaceNoCase(str,"<[^>]*>","","ALL")

В полу-связанном вопросе Я спросил, как изменить мой RegEx , чтобы включить пробелы и разрывы строк. Мне сказали, что использование RegEx для этой цели нецелесообразно, и на этот пост ссылались как на объяснение.

Я сильно подозреваю, что отправленные вами регулярные выражения на самом деле работают неправильно. Я бы посоветовал вам не использовать регулярные выражения для разбора HTML, поскольку HTML не является регулярным языком. Вместо этого используйте HTML-парсер. ( Марк Байерс )

Если это правда, то какой инструмент подходит для удаления HTML из строки перед ее отображением? (Учитывая, что HTML уже безопасен, он очищается перед входом в БД).

Мне известны HTMLEditFormat () и HTMLCodeFormat () , но эти две функции не обеспечивают то, что мне нужно; предыдущий заменяет специальные символы на экранированные HTML-эквиваленты, тогда как последний делает то же самое, но также переносит строку в тег <pre>.

То, что я хотел бы сделать, это очистить строку от HTML и разрывы строк перед отображением в атрибуте заголовка HTML <a title="My string without HTML goes here">...</a>

Бывают случаи, когда HTML не нужен. Скажем, вы хотите отобразить отрывок из поста, например, без HTML, сохраненного вместе с ним.

Ответы [ 3 ]

5 голосов
/ 29 декабря 2010

Я не согласен с твоей аргументацией. Хотя HTML не должен быть проанализирован с регулярным выражением, для них идеально подходит разделение тегов.

Но вы захотите быть осторожнее, чем просто <[^>]*>, так как это обернется

<span title=">">...</span>

в плохо сформированных

">...</span>

Так что вам нужно что-то вроде <([^">]|"[^"]*"|'[^']*')*>. Вы можете вырезать разрывы строк с заменой символов вместо регулярного выражения, но если вы предпочитаете регулярное выражение, вы можете использовать что-то вроде \n (или даже комбинировать его с вышеупомянутым, используя чередование, но это даже менее эффективно).

1 голос
/ 03 января 2011

Если фрагмент HTML должен быть включен в заголовок, вы, вероятно, можете охватить все базы регулярными выражениями и достаточным количеством тестов.

Тем не менее, в качестве общего совета, если вам нужно обработать большой фрагмент, яможно было бы пойти по пути XML / DOM с Java, либо с помощью синтаксического анализа dom4j и получения текста, либо, что более вероятно, с помощью Stringbuilding результата с помощью синтаксического анализатора SAX.

[EDIT] Когда я впервые ответил, я собиралсяНапишите, что HTML-код должен быть достаточно хорошо сформирован, но он предполагает, по крайней мере, небольшой контроль над источником.Если у вас его нет, я просто быстро свяжусь с JTidy и TagSoup , конечно же, не протестировав ни того, ни другого, но я определенно первым деломтест для использования реального HTML с CF.

1 голос
/ 29 декабря 2010

Использовать chilkat html parser chilkat . Мы использовали это в моем академическом проекте для извлечения всего контента и гиперссылок со страниц HTML для создания базовой поисковой системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...