2010-10-16 2 views
2

У меня есть титул на блог идет как этот Main Idea, key term, key term, keytermПростой регулярный экспресс вопрос

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

Вот план:

HTML (перед)

<a href="stupidreqexquestion">Main Idea, key term, key term, key term</a> 

HTML (после)

<a href="stupidreqexquestion">Main Idea <span class="smaller_font">, key term, key term key term</span></a> 

Я использую Rails, так что я планирую добавить это в качестве вспомогательной функции - для ex:

вспомогательный

def make_key_words_in_title_smaller(title) 
     #replace the keywords in the title with key words surrounded by span tags 
    end 

вид

<% @posts.each do |post |%> 
     <%= make_key_words_in_title_smaller(post.title)%> 
    <% end -%> 
+0

Есть причина, вы не включили в последний ключевой термин в пролете? – Skilldrick

+0

na, это опечатка – s84

+0

Основная идея всегда указана первыми? – tinifni

ответ

3

Если вы не заботитесь о Main Idea части будучи "Welcome home, Roxy Carmichael", то есть с Comman в двойных кавычках

>> t = "Main Idea, key term, key term, key term" 
=> "Main Idea, key term, key term, key term" 

>> t.gsub(/(.*?)(,.*)/, '\1 <span class="smaller_font">\2</span>') 
=> "Main Idea <span class=\"smaller_font\">, key term, key term, key term</span>" 
+0

работает и очень прост, спасибо! – s84

2

Если строка прикрас, (т.е. , без меток), либо из этих работ хорошо:

data = 'Main Idea, key term, key term, key term' 

# example #1 
/^(.+?,)(.+)/.match(data).captures.each_slice(2).map { |a,b| a << %Q{<span class="smaller_font">#{ b }</span>}}.first 
# => "Main Idea, <span class=\"smaller_font\">key term, key term, key term</span>" 

# example #2 
data =~ /^(.+?,)(.+)/ 
$1 << %Q{<span class="smaller_font">#{ $2 }</span>} 
# => "Main Idea, <span class=\"smaller_font\">key term, key term, key term</span>" 

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

HTML-парсеры являются обычно рекомендуемым решением, потому что они будут продолжать работать, если изменяется содержимое или его форматирование. Это то, что я сделал бы с помощью Нокогири. Я намеренно многословно объяснять, что происходит:

require 'nokogiri' 

# build a sample document 
html = '<a href="stupidreqexquestion">Main Idea, key term, key term, key term</a>' 
doc = Nokogiri::HTML(html) 

puts doc.to_s, '' 

# find the link 
a_tag = doc.at_css('a[href=stupidreqexquestion]') 

# break down the tag content 
a_text = a_tag.content 
main_idea, key_terms = a_text.split(/,\s+/, 2) # => ["Main Idea", "key term, key term, key term"] 
a_tag.content = main_idea 

# create a new node 
span = Nokogiri::XML::Node.new('span', doc) 
span['class'] = 'smaller_font' 
span.content = key_terms 

puts span.to_s, '' 

# add it to the old node 
a_tag.add_child(span) 

puts doc.to_s 
# >> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
# >> <html><body><a href="stupidreqexquestion">Main Idea, key term, key term, key term</a></body></html> 
# >> 
# >> <span class="smaller_font">key term, key term, key term</span> 
# >> 
# >> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
# >> <html><body><a href="stupidreqexquestion">Main Idea<span class="smaller_font">key term, key term, key term</span></a></body></html> 

В выводе выше вы можете увидеть, как Nokogiri построен образец документа, продолжительность добавляемый, и итоговый документ.

Это может быть упрощена:

require 'nokogiri' 

doc = Nokogiri::HTML('<a href="stupidreqexquestion">Main Idea, key term, key term, key term</a>') 

a_tag = doc.at_css('a[href=stupidreqexquestion]') 
main_idea, key_terms = a_tag.content.split(/,\s+/, 2) 
a_tag.content = main_idea 

a_tag.add_child("<span class='smaller_font'>#{ key_terms }</span>") 

puts doc.to_s 
# >> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
# >> <html><body><a href="stupidreqexquestion">Main Idea<span class="smaller_font">key term, key term, key term</span></a></body></html> 
+0

Ваше письмо фантастическое! Хотел бы я, чтобы я был более ясен. Что я имел в виду под тегом css, так это то, как я хотел, чтобы это было после применения регулярного выражения или nokogiri, поэтому вы не могли использовать его для получения ключевых терминов, вам нужно было бы использовать первую запятую и конец строки как маркеры. Серьезно большое сообщение спасибо большое! – s84

+0

Я не уверен, что вы имеете в виду.Можно найти разделы в документе без использования XPath или CSS, но поиск будет намного менее точным. Обычно мы ищем какой-то постоянный «ориентир» для навигации, даже если это означает найти его, а затем двигаться вверх, вниз или вбок, чтобы добраться до места назначения. Если вам нужно всего лишь настроить простую строку и добавить тег '', то это невероятно простая проблема, я бы ожидал, что у разработчика Rails не возникнет проблем с выяснением. –

+0

Знак будет первой запятой и концом строки, поэтому я не знаю, как это обнаружит Нокогири. Я использовал nokogiri для очистки экрана, например создания новостных лент, но для анализа AFAIK ему нужен какой-то класс xml или html. – s84

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