目标是什么
<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>."