2009-09-02 3 views
2

Я хочу очистить HTML-страницу своих тегов с помощью Ruby. У меня есть необработанный HTML-код и вы хотите определить список тегов, например. [ «Пядь», «Ли», «DIV»], и создать массив регулярных выражений, которые я мог бы работать последовательно, так что у меня естьRuby список тегов для свободного регулярного выражения

clean_text = raw.gsub(first_regex,' ').gsub(second_regex,' ')... 

с двумя регулярными выражениями в теге (начало и конец) ,

Есть ли у меня способ сделать это программно (т. Е. Предварительно построить массив регулярных выражений из массива тегов, а затем запустить их в свободном шаблоне)?

EDIT: Я понимаю, что на самом деле я задал сразу два вопроса. Первый из них касается преобразования списка тегов в список регулярных выражений, а второй - о вызове списка регулярных выражений в качестве свободного. Спасибо, что ответили на оба вопроса. Я постараюсь сделать свои следующие вопросы однотипными.

+3

у вас подумал об использовании правильного анализатора xml/html (например, nokogiri http://nokogiri.org/)? –

+0

Ну, правильный синтаксический анализатор xml/html - это более надежное решение, но я хочу «просто текст», желая терпеть несколько шумный результат взамен того, что вам не нужно отображать точную структуру документа. –

ответ

2

Это должно создать одно регулярное выражение для удаления всех ваших тегов.

clean_text = raw.gsub(/<\/?(#{tags.join("|")})>/, '') 

Однако, вы должны улучшить его для поддержки тегов с атрибутами (например, < A HREF = "..." >), в настоящее время только простые теги удаляются (например, < >)

+1

это наивно улучшит его: /<\/?(#{tags.join("|")})[^>]*>/ - сломается, если какое-либо значение атрибута содержит '>' –

1

Предполагая, что у вас есть метод build_regex превратить тег в регулярное выражение, это должно сделать это:

tags = %w(span div li) 
clean_text = tags.inject(raw) {|text, tag| text.gsub build_regex(tag), ' ' } 

Вызова инъекционного передает результат каждой замены в следующую итерацию блока, что дает эффект запускать каждый gsub по строке один за другим.