Заключение части строки в тег `` 1000 * ` - PullRequest
0 голосов
/ 10 марта 2011

У меня есть строка вроде:

<a href="x.com">x.com</a>

.. в котором я хочу заменить текст тега, чтобы он был заключен в тег <i>:

<a href="x.com"><i>x.com</i></a>

Используя регулярное выражение >.*<, я получаю совпадение для >x.com<, но мне просто нужен точный текст, чтобы я мог gsub it:

'<a href="x.com">x.com</a>'.gsub(<what here?>,<what here?>)

Как мне это сделать?

UPDATE

Ps. Это в Rails 3.0.3 на Ruby 1.8.7 p330

Ответы [ 5 ]

2 голосов
/ 10 марта 2011

Nokogiri - отличный инструмент для анализа HTML и XML в Ruby. Его использование освобождает вас от разного рода несоответствий HTML из-за неправильной разметки или изменения структуры.

Это обернет содержимое всех тегов <a> в документе HTML:

require 'nokogiri'

html = '<a href="x.com">x.com</a>'
doc = Nokogiri::HTML::DocumentFragment.parse(html)

doc.search('a').each do |_node|  
  _node.inner_html = "<i>#{_node.content}</i>"
end

puts doc

# >> <a href="x.com"><i>x.com</i></a>
1 голос
/ 10 марта 2011

Используйте (? <= Шаблон), который указывает предыдущий контекст, и (? = Шаблон), который указывает следующий контекст. </p>

'<a href="x.com">x.com</a>'.gsub(/(?<=\>).*?(?=\<)/, '<i>\0</i>')
1 голос
/ 10 марта 2011

Как насчет добавления скобок, используя >(.*)<, а не >.*<?

1 голос
/ 10 марта 2011

Я бы настоятельно рекомендовал не редактировать HTML, как это, но это должно делать то, что вы хотите:

'<a href="x.com">x.com</a>'.gsub(/>(.*?)</, '><i>\1</i><')
0 голосов
/ 10 марта 2011

Я не очень хорошо знаю Ruby, но, может быть, у него есть библиотека для разбора HTML, которая может делать это более надежно, чем регулярные выражения?

Обязательная ссылка для синтаксического анализа HTML с помощью регулярных выражений

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