Ruby on rails 简单正则表示疑问句

Ruby on rails 简单正则表示疑问句,ruby-on-rails,ruby,regex,Ruby On Rails,Ruby,Regex,我在博客上有一个标题是这样的:主要思想,关键术语,关键术语,关键术语 我希望主要思想和关键术语有不同的字体大小。想到的第一件事是搜索第一个逗号和字符串的结尾,并用相同的东西替换该块,但用一个类的span标记包围,以使字体更小 计划如下: 以前的HTML <a href="stupidreqexquestion">Main Idea, key term, key term, key term</a> 看法 如果你不在乎“欢迎回家”这一主题的话,罗西·卡迈克尔(Roxy

我在博客上有一个标题是这样的:主要思想,关键术语,关键术语,关键术语

我希望主要思想和关键术语有不同的字体大小。想到的第一件事是搜索第一个逗号和字符串的结尾,并用相同的东西替换该块,但用一个类的span标记包围,以使字体更小

计划如下:

以前的HTML

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


如果你不在乎“欢迎回家”这一主题的话,罗西·卡迈克尔(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>"

如果字符串未加修饰,即没有标签,则以下任一项都可以正常工作:

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>

有什么原因你没有把最后一个关键术语包括在范围内吗?主要观点总是列在第一位吗?是的,主要观点总是列在第一位吗@posts有包括主要观点在内的所有关键术语吗?关键术语只是一个概念而已。这就是我的标题结构。ie:它只是一种格式,语法。。。与实际情况无关,你的写作棒极了!我希望我能说得更清楚些。我所说的css标记是指在应用regex或nokogiri之后,我希望它是这样的,因此您不能使用它来获取关键术语,您必须使用字符串的第一个逗号和结尾作为标记。非常感谢,非常感谢!我不知道你的意思。不使用XPath或CSS就可以定位文档中的节,但是搜索的准确性会低很多。通常我们寻找某种固定的地标来导航,即使这意味着找到它,然后向上、向下或侧向移动以到达目的地。如果您只需要调整一个简单的字符串并添加标记,那么这是一个非常简单的问题,我希望Rails开发人员能够毫不费力地解决这个问题。里程碑将是字符串的第一个逗号和结尾,所以我不知道Nokogiri会如何找到它。我使用nokogiri进行屏幕抓取,比如创建新闻提要,但它需要某种xml或html类来由AFAIK解析。
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>"
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>
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>