Это упрощенный пример того, как сделать это с помощью парсера:
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 вы должны использовать парсер. Это потому, что они имеют дело с фактической структурой документа, поэтому, если документ изменяется, есть большая вероятность того, что синтаксический анализатор не будет перепутан.