使用ruby(而不是rails),我试图弄清楚如何用字符串替换(不附加)静态文件中的某个块。例如,在static_file.html中我想替换html注释“start”和“end”之间的所有内容:
<p>lorem ipsum blah blah ipsum</p>
<!--start-->
REPLACE MULTI-LINE
CONTENT HERE...
<!--end-->
<p>other stuff still here...</p>
某些answers here有助于在某个位置插入文字,但不会在两者之间进行处理。
答案 0 :(得分:4)
这是一个为您处理它的功能。只需传递一个文件路径和要在这些HTML注释块之间替换的内容:
只要您的评论区块的格式始终相同:&lt; - start - &gt;和&lt;! - end - &gt;,这将有效。
def replace(file_path, contents)
file = File.open(file_path, "r+")
html = ""
while(!file.eof?)
html += file.readline
end
file.close()
return html.gsub(/<!--start-->(.*)<!--end-->/im, contents)
end
答案 1 :(得分:2)
简单的答案是:
str = "FOO\n\BAR\nblah \nblah BAZ\nBLOOP"
str.gsub(/BAR.*BAZ/m,"SEE")
我不确定这是否足以满足您的要求。这里的关键是正则表达式末尾的'm'表示多行。如果要模板化某些值,您可能需要查看ERB模板而不是此gsub。另外,请注意正则表达式中需要转义的内容。
答案 2 :(得分:1)
这是如何使用解析器执行此操作的简化示例:
require 'nokogiri'
html = '<p>lorem ipsum blah blah ipsum</p>
<!--start-->
REPLACE MULTI-LINE
CONTENT HERE...
<!--end-->
<p>other stuff still here...</p>'
doc = Nokogiri.HTML(html)
puts doc.to_html
解析后我们得到:
# >> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
# >> <html><body>
# >> <p>lorem ipsum blah blah ipsum</p>
# >>
# >> <!--start-->
# >> REPLACE MULTI-LINE
# >> CONTENT HERE...
# >> <!--end-->
# >>
# >> <p>other stuff still here...</p>
# >> </body></html>
doc.at('//comment()/following-sibling::text()').content = "\nhello world!\n"
puts doc.to_html
找到评论后,踩到下一个text()
节点并替换它:
# >> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
# >> <html><body>
# >> <p>lorem ipsum blah blah ipsum</p>
# >>
# >> <!--start-->
# >> hello world!
# >> <!--end-->
# >>
# >> <p>other stuff still here...</p>
# >> </body></html>
如果您的HTML总是很简单,不会有字符串破坏您的搜索模式,那么您可以使用搜索/替换。
如果您查看,您会发现对于任何非平凡的HTML操作,您应该使用解析器。那是因为它们处理文档的实际结构,所以如果文档发生变化,解析器就有更好的机会不被混淆。