轨道将句子拆分为单独的单词,但替换某些单词



目标是什么

<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

虽然这工作正常,但我仍然需要像上面的例子一样将每个单词分开。

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

你可以做这样的事情:

sentence = 'I helped Adidas brand rebuild their design system'
words  = ["Adidas", "brand"]
sentence = sentence.split(/W+/)
sentence.map! do |word|
words.include?(word) ? "<span class='highlight'>#{word}</span>" : "<span>#{word}</span>"
end

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

您可以使用此方法:

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

我想你正在寻找这个:

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

我似乎不明白你为什么要拆分句子本身?为什么不反过来,您将"突出显示"作为一个数组,然后循环突出显示单词,为每个单词添加句子,例如:

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

最新更新