Простой регулярный экспресс-вопрос - PullRequest
2 голосов
/ 17 октября 2010

У меня заголовок в блоге выглядит так: Main Idea, key term, key term, keyterm

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

Вотplan:

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, поэтому планирую добавить это как вспомогательную функцию -Например:

Помощник

  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 -%>

Ответы [ 2 ]

3 голосов
/ 17 октября 2010

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

>> 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>"
2 голосов
/ 17 октября 2010

Если строка не украшена (т. Е. Без тегов), любой из этих методов работает хорошо:

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-парсеры являются обычным рекомендуемым решением, потому что они продолжат работать, если контент или его форматированиеизменения.Это то, что я бы сделал, используя Nokogiri.Я был намеренно многословен, чтобы объяснить, что происходит:

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...