Заменить содержимое в файле между двумя маркерами - PullRequest
4 голосов
/ 30 января 2011

Используя ruby ​​(не rails), я пытаюсь выяснить, как заменить (не добавлять) определенный блок в статическом файле на строку. Например, в static_file.html я хочу заменить все между html-комментариями «начало» и «конец»:

<p>lorem ipsum blah blah ipsum</p>

<!--start-->
REPLACE MULTI-LINE
CONTENT HERE...
<!--end-->

<p>other stuff still here...</p>

Некоторые из ответов здесь полезны для вставки текста в определенном месте, но не обрабатывают между ними.

Ответы [ 3 ]

4 голосов
/ 30 января 2011

Вот функция для вас. Просто передайте ему путь к файлу и содержимое для замены между этими блоками комментариев HTML:

Пока ваши блоки комментариев всегда форматируются одинаково: <- start -> и <! - end ->, это будет работать.

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
2 голосов
/ 30 января 2011

простой ответ будет:

str = "FOO\n\BAR\nblah \nblah BAZ\nBLOOP"
str.gsub(/BAR.*BAZ/m,"SEE")

Я не уверен, достаточно ли это надежно для того, что вы пытаетесь сделать.Ключом здесь является 'm' в конце регулярного выражения для обозначения многострочного.Если это для шаблонирования некоторых значений, вы можете захотеть взглянуть на что-то вроде ERB-шаблонов вместо этого gsub.Также будьте осторожны с тем, что вам нужно избегать в регулярных выражениях.

1 голос
/ 30 января 2011

Это упрощенный пример того, как сделать это с помощью парсера:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...