удалить пробелы из HTML-документа, используя ruby - PullRequest
4 голосов
/ 19 июня 2010

Итак, у меня есть строка в ruby, которая похожа на

str = "<html>\n<head>\n\n  <title>My Page</title>\n\n\n</head>\n\n<body>" +
      "  <h1>My Page</h1>\n\n<div id=\"pageContent\">\n  <p>Here is a para" +
      "graph. It can contain  spaces that should not be removed.\n\nBut\n" +
      "line breaks that should be removed.</p></body></html>"

Как бы я удалил все пробелы (пробелы, табуляции и разрывы строк), которые находятся за пределами тега / не находятся внутри тега с содержимым, подобным <p>, используя только собственный Ruby?

(Я бы хотел не использовать XSLT или что-то еще для такой простой задачи.)

Ответы [ 4 ]

9 голосов
/ 20 июня 2010
str.gsub!(/\n\t/, " ").gsub!(/>\s*</, "><")

Эта первая gsub! заменяет все разрывы строк и табуляции пробелами, вторая удаляет пробелы между тегами.

В результате вы получите несколько пробелов внутри тегов, но если вы просто удалили все\n и \t, вы получите что-то вроде «не удаляться. Разрывы строк», что не очень читабельно.Об этом может позаботиться другое регулярное выражение или вышеупомянутый .squeeze(" ").

7 голосов
/ 12 декабря 2012

Ненавижу расстраиваться из-за регулярных выражений, но ни один из других ответов не является строго правильным. Это будет работать:

str.gsub(/>\s*/, ">").gsub(/\s*</, "<")

Явное преобразование символов новой строки не требуется, поскольку /\s/ соответствует всем пробельным символам, включая символ новой строки. Регулярное выражение в других ответах не является строго правильным, потому что его регулярное выражение не соответствует "\r", которое используется в конце строк в Windows и будет появляться в электронных письмах.

Моя строка также преобразует <p> foo bar </p> в <p>foo bar</p>, но вы, возможно, этого не захотите.

1 голос
/ 19 июня 2010

Вы можете сжать все группы пробельных символов в один пробел (то есть, hello world в hello world), используя String # squeeze:

"hello     world".squeeze(" ")  # => "hello world"

Где параметр squeeze является символом, который должен бытьsqueezed.

РЕДАКТИРОВАТЬ: Я неправильно прочитал ваш вопрос, извините.

Это будет

  • удалить последовательные пробелы внутри тегов
  • оставить отдельные пробелы вне тегов

Я сейчас поработаю над решением.

0 голосов
/ 05 февраля 2016
xml.squish.gsub /(> <)/, '><'

Даже короче, чем выше.

PS Я люблю смешные лица.

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