替换两个标记之间的文件中的内容

时间:2011-01-30 04:07:55

标签: ruby

使用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有助于在某个位置插入文字,但不会在两者之间进行处理。

3 个答案:

答案 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操作,您应该使用解析器。那是因为它们处理文档的实际结构,所以如果文档发生变化,解析器就有更好的机会不被混淆。