2012-04-02 4 views
2

Я пишу программу для командной строки для своей команды, используя Ruby.File maniuplation with Ruby

Я пытаюсь осмотреть HTML-документ в файловой системе и добавить новый <script> тег перед </head>

Что-то вроде:

<html> 
    <head> 
    <script src="...foo.js"></script> 
    <script src="...bar.js"></script> 
    <!-- I WANT TO INSERT NEW TEXT HERE --> 
    </head> 
    <body> 
    </body> 
</html> 

Я думал, начиная с IO.readlines(file_name), сравнивая каждую строку регулярное выражение и добавление моего нового тега перед </head>. Затем объедините весь массив обратно в новую версию файла.

Это звучит слишком сложно. У кого есть лучший способ?

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

+1

http://stackoverflow.com/a/1732454/576139 –

ответ

1

В вашем конкретном случае это не такая плохая идея. Если у вас есть эта специальная строка в файле, вы можете легко найти ее, извлечь необходимое количество отступов с начала строки и заменить всю строку другим контентом. Но не делайте этого в памяти. Во время чтения исходного файла вы можете записать его во временный файл, вам не нужно есть RAM.

Если HTML комментарий был просто пример, и эта строка не существует, вы можете заменить первое вхождение в </головы > с < сценария > ... </скрипт > </головной > с regexp, не нужно разбирать HTML. (Но это справедливо только в вашем специальном случае.) Чтобы быть откровенным, вам тоже не нужен Ruby, потому что команда sed идеально подходит для этой работы.

Или если вы делаете другие проверки, например, что скрипт уже существует или нет, то использовать любой HTML-парсер lib/gem. Я предлагаю вам hpricot, если вам нравится концепция jQuery, потому что hpricot имеет очень похожий подход.

НТН

+0

Спасибо! Я пошел с hpricot и действительно выкопал его. Спасибо за подробный ответ. –

5

HTML и регулярное выражение (очень часто) не очень хорошая идея.

Если вы хотите разобрать и изменить HTML с Ruby в чистом виде, я рекомендую использовать Nokogiri.

http://nokogiri.org/

http://nokogiri.org/tutorials