Замените последовательные повторяющиеся теги одним из этих тегов в Ruby - PullRequest
3 голосов
/ 18 февраля 2011

Я пытаюсь заменить несколько последовательных тегов <br> только одним тегом <br>, используя Ruby.

Например:

Hello
<br><br/><br>
World!

станет

Hello
<br>
World!

1 Ответ

4 голосов
/ 18 февраля 2011

Вы можете сделать это с помощью регулярного выражения, например:

 "Hello\n<br><br/><br>\nworld".gsub(/(?im)(<br\s*\/?>\s*)+/,'<br>')

Чтобы объяснить, что: у части (?im) есть опции, указывающие, что совпадение должно быть без учета регистра и что . должно соответствовать переводу строки. Сгруппированное выражение (<br\s*\/?>\s*) соответствует <br> (необязательно с пробелами и завершающим /), за которым, возможно, следует пробел, а + говорит, что соответствует одной или нескольким из этой группы.

Тем не менее, я должен отметить, что в целом использование регулярных выражений для манипулирования HTML не очень хорошая идея - вместо этого следует использовать правильный синтаксический анализатор. Например, вот лучший способ сделать это, используя Nokogiri :

require 'nokogiri'

document = Nokogiri::HTML.parse("Hello
<br><br/><br>
World!")

document.search('//br').each do |node|
    node.remove if node.next.name == 'br'
end

puts document

Это приведет к выводу типа:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>Hello
<br>
World!</p></body></html>

(Анализатор превращает ваш ввод в правильно сформированный документ, поэтому у вас есть DOCTYPE и теги <html><body><p>.)

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