我需要创建一个方法,该方法将在第一个<body>
之后立即将传递给它的值插入到index.html文件的主体中。
我有代码:
class New_class
def status(sourse, hp, sleep)
@sourse = sourse
File.open(@sourse, 'a'){ |file| file.puts hp, sleep }
end
end
tamgem = New_class.new
tamgem.status("index.html", 20, 20)
如何确保将传递给此方法的数字插入HTML文档的正文中?另外,请注意,这仅是Ruby,而不是Rails。
答案 0 :(得分:1)
您可以制作这样的方法:
def write_after_body(original_file, new_file, *new_content)
File.open(new_file, 'w') do |file|
IO.foreach(original_file) do |line|
file.write(line)
if line.include? '<body>'
file.write(*new_content)
end
end
end
end
它将保持原始文件不变,并使用所需的更改创建一个新文件,因为同时读写同一文件并不是一个好主意。调用这样的方法:
write_after_body("index.html", "new_index.html", 20," ", 20)
将所有内容从原始文件index.html
复制到新文件new_index.html
,并将20
," "
和20
添加到新行在<body>
标签之后。之后,如果您对结果满意,可以删除/移动旧文件并重命名新文件。
答案 1 :(得分:1)
使用正则表达式或其他诸如StringScanner之类的其他原始方法来解析HTML是seldom a good idea。而是使用实际上可以理解HTML的HTML解析器(nokogiri)。
require 'nokogiri'
@doc = Nokogiri::HTML('<html><body></body></html>')
@doc.at('body').add_child('<h1>Hello World</h1>')
@doc.to_html
# => "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body><h1>Hello World</h1></body></html>\n"
答案 2 :(得分:0)
Ruby有一个名为StringScanner
的内置类,可以用作在字符串中查找某些模式位置的便捷方法。
为什么这对您有用?您可以尝试在<body>
标记之后找到第一个字符的索引。
知道该索引后,您可以轻松地将子字符串插入HTML的正确位置。
这里是一个例子:
<!-- index.html -->
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>
<h1>This is a Heading</h1>
<p>This is a paragraph</p>
</body>
</html>
# Ruby script in the same folder as `index.html`.
# Library where StringScanner is located.
require 'strscan'
# Read all content of `index.html` and store it into a variable.
html = File.read('index.html')
# Create the StringScanner instance.
scanner = StringScanner.new(html)
# Then you are scanning your HTML string until the first occurence of the <body> tag.
scanner.scan_until(/<body>/)
# If your search is successful,
# then the scan pointer position will be just beyond the last character of the match.
#
# In other words,
# the scan pointer position will be the index of the first character after `<body>` tag.
index = scanner.pos
# Simple insert
updated_html = html.insert(index, "\nHello")
# Write updated content to `index.html`.
File.write('index.html', updated_html)
因此,您的课程可能类似于以下内容:
require 'strscan'
class New_class
def status(source, hp, sleep)
html = File.read(source)
scanner = StringScanner.new(html)
scanner.scan_until(/<body>/)
index = scanner.pos
updated_html = html.insert(index, "#{hp} #{sleep}")
File.write(source, updated_html)
end
end
tamgem = New_class.new
tamgem.status("index.html", 20, 20)
最后一点:如果您没有任何特殊要求,请使用CamelCase作为类名,这是大多数Ruby样式指南所建议的。以下是一些示例:Rubocop,Airbnb。
来源:
阅读本文后
一般来说,我同意it is not a good idea to use regular expressions to parse HTML, 因此,当问题相对简单时,您可以使用上述方法, 但是如果您需要更全面的信息,请参阅@max answer。