Как найти несколько совпадений подстрок в строке, изменить вложенные подстроки - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь проанализировать строку HTML с помощью ruby, эта строка содержит несколько тегов , мне нужно найти и закодировать все скобки < и > между каждым из этих элементов.

<code>Example: 

string_1_pre = "<pre><h1>Welcome</h1>
"string_2_pre ="
<h1>Welcome</h1>
<h1>Goodbye</h1>
"def clean_pre_code (html_string) matched = html_string.match (/ (? <= <pre>).*(?=<\/pre>)/) cleaned = matched.to_s.gsub(/[<]/, "&lt;").gsub(/[>]/, "&gt;") html_string.gsub(/(?<=<pre>).*(?=<\/pre>)/, cleaned) end clean_pre_code(string_1_pre) #=> "<pre>&lt;h1&gt;Welcome&lt;/h1&gt;" clean_pre_code (string_2_pre) # => "
&lt;h1&gt;Welcome&lt;/h1&gt;&lt;/pre&gt;&lt;pre&gt;&lt;h1&gt;Goodbye&lt;/h1&gt;
"

Это работает до тех пор, пока html_string содержит только один элемент , но не при наличии нескольких.

Я был бы открыт для решения, которое использует Nokogiri или подобное,но не могу понять, как заставить его делать то, что я хочу.

Пожалуйста, дайте мне знать, если вам нужен какой-либо дополнительный контекст.

Обновление: это возможно только с Нокогири, см. принятый ответ.

1 Ответ

0 голосов
/ 02 февраля 2019

@ zstrad44 Да, вы можете сделать это с помощью Nokogiri.Вот моя версия кода, которую я разработал для вашей версии, и она даст вам желаемый результат для нескольких pre тегов в строке.

def clean_pre_code(html_string)
  doc = Nokogiri::HTML(html_string)
  all_pre = doc.xpath('//pre')
  res = ""
  all_pre.each do |pre|
    pre = pre.to_html
    matched = pre.match(/(?<=<pre>).*(?=<\/pre>)/)
    cleaned = matched.to_s.gsub(/[<]/, "&lt;").gsub(/[>]/, "&gt;")
    res += pre.gsub(/(?<=<pre>).*(?=<\/pre>)/, cleaned)
  end
  res
end

Я бы порекомендовал вам прочитать Nokogiri Cheatsheet , чтобы лучше понять методы, которые я использовал в коде.Удачного кодирования!Надеюсь, что смогу помочь

...