2010-12-29 4 views
3

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

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

В вопросе I asked how to modify my RegEx полу связанных включать пробелы и разрывы строк. Мне сказали, что с помощью регулярных выражений для этой цели не подходит и this post was referenced as an explanation.

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

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

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

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

Есть времена, когда HTML не требуется. Например, вы хотите отобразить выдержку из сообщения без HTML, хранящегося вместе с ним, например.

ответ

5

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

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

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

в больной сформированным

">...</span> 

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

+0

Charles, большое спасибо за объяснение. Я оставлю это открытым на некоторое время, чтобы узнать, могу ли я поощрять дальнейший ввод. Можете ли вы пояснить, что вы имели в виду, используя «замену персонажа»? Есть ли определенная функция, которая делает это? Будет оценена любая дополнительная разработка концепции. – Mohamad

+0

Я думал о 'Replace (str, '\ n', '', 'all')'. – Charles

+0

Чарльз, проблема с строкой, которую вы сделали, заключается в том, что я не могу ее использовать. Двойные кавычки запутывают функцию и вызывают ошибку, так как вся строка regEx должна сидеть между двойными кавычками ... любая идея, как я могу обойти это? – Mohamad

1

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

1

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

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

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

Смежные вопросы