2010-10-16 4 views
2

J'ai un titre sur un blog comme celui-ci va Main Idea, key term, key term, keytermquestion simple express régulière

Je veux l'idée principale et les termes clés pour avoir une taille de police différentes. La première chose qui me vint à l'esprit était de chercher la première virgule et la fin de la chaîne et de remplacer ce morceau par la même chose mais entouré par des balises span avec une classe pour rendre la police plus petite.

Voici le plan:

HTML (avant)

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

HTML (après)

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

J'utilise Rails Je prévois donc d'ajouter cela comme une fonction d'assistance - Par ex:

assistant

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

vue

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

Y at-il une raison que vous n'avez pas inclus le dernier terme clé dans la durée? – Skilldrick

+0

na, il s'agit d'une faute de frappe – s84

+0

L'idée principale est-elle toujours listée en premier? – tinifni

Répondre

3

Si vous ne se soucient pas de la partie Main Idea étant "Welcome home, Roxy Carmichael", qui est, avec un comman entre guillemets

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

fonctionne et c'est très simple, merci! – s84

2

Si la chaîne est sans fioritures, (c.-à- , sans étiquettes) l'un ou l'autre fonctionne bien:

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

Si la chaîne contient des balises, il est déconseillé d'utiliser regex pour traiter du code HTML ou XML, car cela casse si facilement. Les utilisations extrêmement triviales contre HTML que vous contrôlez sont assez sûres mais si le contenu ou le format change l'expression régulière peut s'effondrer casser votre code.

Les analyseurs HTML sont la solution généralement recommandée car ils continueront de fonctionner si le contenu ou son formatage change. C'est ce que je ferais en utilisant Nokogiri. J'étais délibérément bavard pour expliquer ce qui se passait:

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> 

Dans la sortie ci-dessus, vous pouvez voir comment Nokogiri construit le document de l'échantillon, la durée ajoutée, et le document résultant.

Il peut être simplifié à:

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

Votre écriture est fantastique! J'aurais aimé être plus clair. Ce que je voulais dire par la balise css était que je voulais que ce soit après l'application de la regex ou du nokogiri pour ne pas pouvoir l'utiliser pour obtenir les termes clés, il fallait utiliser la première virgule et la fin de la chaîne en tant que marqueurs. Sérieusement super merci beaucoup! – s84

+0

Je ne suis pas sûr de ce que vous voulez dire.Il est possible de localiser des sections dans un document sans utiliser XPath ou CSS mais la recherche sera beaucoup moins précise. Normalement, nous cherchons une sorte de "point de repère" constant pour naviguer, même si cela signifie qu'il faut le trouver puis monter, descendre, ou de côté pour arriver à la destination. Si tout ce dont vous avez besoin est d'ajuster une simple chaîne et d'ajouter la balise '', alors c'est un problème incroyablement simple, auquel je m'attendrais à ce qu'un développeur de Rails ne trouve aucun problème. –

+0

Le point de repère serait la première virgule et la fin de la chaîne, donc je ne sais pas comment Nokogiri trouverait cela. J'ai utilisé nokogiri pour le scrappage d'écran, comme la création de flux de nouvelles, mais il a besoin d'une sorte de classe xml ou html pour analyser par AFAIK. – s84