В Ruby есть встроенный класс StringScanner
, который можно использовать как удобный способ найти положение некоторого шаблона внутри строки.
Почему это можетбыть полезным в вашем случае? Вы можете попытаться найти индекс первого символа после тега <body>
.
Зная этот индекс, вы можете легко вставить подстроку в нужное место в вашем HTML.
Вотпример:
<!-- index.html -->
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>
<h1>This is a Heading</h1>
<p>This is a paragraph</p>
</body>
</html>
# Ruby script in the same folder as `index.html`.
# Library where StringScanner is located.
require 'strscan'
# Read all content of `index.html` and store it into a variable.
html = File.read('index.html')
# Create the StringScanner instance.
scanner = StringScanner.new(html)
# Then you are scanning your HTML string until the first occurence of the <body> tag.
scanner.scan_until(/<body>/)
# If your search is successful,
# then the scan pointer position will be just beyond the last character of the match.
#
# In other words,
# the scan pointer position will be the index of the first character after `<body>` tag.
index = scanner.pos
# Simple insert
updated_html = html.insert(index, "\nHello")
# Write updated content to `index.html`.
File.write('index.html', updated_html)
Итак, вероятно, ваш класс будет выглядеть следующим образом:
require 'strscan'
class New_class
def status(source, hp, sleep)
html = File.read(source)
scanner = StringScanner.new(html)
scanner.scan_until(/<body>/)
index = scanner.pos
updated_html = html.insert(index, "#{hp} #{sleep}")
File.write(source, updated_html)
end
end
tamgem = New_class.new
tamgem.status("index.html", 20, 20)
В качестве последнего примечания: если у вас нет особых требований,пожалуйста, используйте CamelCase для имен классов, как это предлагается большинством руководств по стилю Ruby. Вот несколько примеров: Rubocop , Airbnb .
Источники:
- StringScanner
- Строка # insert
- File.read
- File.write
- CamelCaseКлассы по Rubocop
- CamelCase Классы по Airbnb
После прочтения этой статьи
Обновление
Согласенв общем случае нецелесообразно использовать регулярные выражения для разбора HTML , поэтому, когда проблема относительно проста, вы можете использовать описанный выше подход, но если вам нужно что-то более всеобъемлющее, обратитесь к @ максимальный ответ .