Rails将句子分成单独的单词但替换某些单词

时间:2017-07-04 10:13:26

标签: html ruby-on-rails

目标是什么

<span>I</span> 
<span>helped</span>
<span>the</span>
<span class="highlighted">Adidas</span>
<span class="highlighted">brand</span>
<span>rebuild</span>
<span>their</span>
<span>design</span>
<span>system</span>

我正在开发一个Rails项目。我有数据形成如下句子:

sentence = 'I helped Adidas rebuild their design system'

我可以将这些单词与sentence.split(/\W+/)分开,然后我得到:

[I] [helped] [Adidas] [rebuild] [their] [design] [system]

但我想通过将它包装在一个类中来强调单词Adidas

有时,突出显示的单词可以是Adidas brand

等单词的组合

为此,我尝试了:

sentence.sub(sentenceHighlight, "<span>#{sentenceHighlight}</span>")

这给了我:

I helped the <span>Adidas brand</span> rebuild their design system

虽然工作正常但我仍然需要将每个单词分开,如上例所示。

有谁知道如何在干净的代码中很好地结合这两种方法?

4 个答案:

答案 0 :(得分:2)

你可以这样做:

'Gives me a numeric value(e.g  14)
TAG POS=1 TYPE=span ATTR=CLASS:proPriceField&&TXT:* EXTRACT=TXT
SET ProPrice EVAL("'{{!EXTRACT}}'.match(/[0-9,]+/);")
SET !EXTRACT NULL

'Gives me a numeric value(e.g  2456)
TAG POS=1 TYPE=span ATTR=CLASS:sqrPriceField&&TXT:* EXTRACT=TXT
SET SqrPrice EVAL("'{{!EXTRACT}}'.match(/[0-9,]+/);")
SET !EXTRACT NULL

'Gives me a text value(e.g "Kalyan")
TAG POS=1 TYPE=span ATTR=CLASS:localityFirst&&TXT:* EXTRACT=TXT
SET Locality {{!EXTRACT}}
SET !EXTRACT NULL

'Gives me lattiude from a link
TAG POS=2 TYPE=a ATTR=class:stop-propagation&&TXT:* EXTRACT=HTM
SET lat EVAL("'{{!EXTRACT}}'.match(/\?(lat=.+?)&/)[1];")

'Gives me longitude from a link
SET longt EVAL("var regex = /longt=(\\d+(?:\\.\\d+)?)/g; var str = '{{!EXTRACT}}';str.match(regex)[1];")

SET !EXTRACT {{ProPrice}}[EXTRACT]{{SqrPrice}}[EXTRACT]{{Locality}}[EXTRACT]{{lat}}[EXTRACT]{{longt}}

SAVEAS TYPE=EXTRACT FOLDER=* FILE=temp.csv

答案 1 :(得分:1)

您可以使用此方法:

highlight('You searched for: rails', 'rails')
# => You searched for: <mark>rails</mark>

highlight('You searched for: rails', /for|rails/)
# => You searched <mark>for</mark>: <mark>rails</mark>

highlight('You searched for: ruby, rails, dhh', 'actionpack')
# => You searched for: ruby, rails, dhh

highlight('You searched for: rails', ['for', 'rails'], highlighter: '<em>\1</em>')
# => You searched <em>for</em>: <em>rails</em>

highlight('You searched for: rails', 'rails', highlighter: '<a href="search?q=\1">\1</a>')
# => You searched for: <a href="search?q=rails">rails</a>

highlight('You searched for: rails', 'rails') { |match| link_to(search_path(q: match, match)) }
# => You searched for: <a href="search?q=rails">rails</a>

在你的情况下:

highlight('I helped Adidas rebuild their design system', ['Adidas'], highlighter: '<span class="highlighted">\1 brand</span>')
 # => I helped the <span>Adidas brand</span> rebuild their design system

答案 2 :(得分:1)

我似乎不明白你为什么会分裂这句话本身?为什么不相反,你有“高亮”作为一个数组,你循环突出显示单词,gsub'ing每个单词的句子,如:

sentence = 'I helped Adidas brand rebuild their design system'
highlights = ['adidas', 'brand']

highlights.each do |hl|
  sentence.gsub!(/\b#{hl}\b/i, "<span>#{hl}</span>")
end
puts sentence
  $ I helped <span>adidas</span> <span>brand</span> rebuild their design system

如果您需要原始句子中的案例,请使用:

sentence.gsub!(/\b#{hl}\b/i) { |w_capture| "<span>#{w_capture}</span>" }

由于高光将比句子本身更少,所以循环它们而不是句子中的所有单词也更便宜。

编辑:

highlights = ['adidas', 'brand'] #lower case always
sentence = 'I helped Adidas brand rebuild their design system'
sentence.split(/\W+/).map { |w| highlights.include?(w.downcase) ? "<span class='class_1'>#{w} </span>" : "<span>#{w}</span>" }.join(' ') + "."

输出:

=> "<span>I</span> <span>helped</span> <span class='class_1'>Adidas</span> <span class='class_1'>brand</span> <span>rebuild</span> <span>their</span> <span>design</span> <span>system</span>."

答案 3 :(得分:1)

我认为你正在寻找这个:

    sentence = 'I helped Adidas brand rebuild their design system'
    sentenceHighlight = 'Adidas brand'
    (sentence.split(/\W+/) - sentenceHighlight.split(/\W+/)).each{|s| sentence.sub!(s, "<span>#{s}</span>")}
    sentenceHighlight.split(/\W+/).each{|s| sentence.sub!(s, "<span class='highlighted'>#{s}</span>")}


sentence 
#=> "<span>I</span> <span>helped</span> <span class='highlighted'>Adidas</span> <span class='highlighted'>brand</span>  <span>rebuild</span> <span>their</span> <span>design</span> <span>system</span>"