2016-11-29 2 views
0

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

Мы используем redcarpet для анализа разметки и создания примеров кода.

<%= partial '../partials/component' %> 

```html 
    <%= partial '../partials/component' %> 
``` 

Это, однако, оставляет очень грязные и нечитаемые примеры кода. Мы можем хорошо их очистить с помощью htmlbeautifier. Но у нас по-прежнему есть проблема с несколькими пробелами и разрывами строк внутри HTML-тегов.

Это часто выглядит следующим образом:

<article class="default-s-sans teaser-media" 

    data-item-ratio="16x9" 


    data-background-color="d-blue" 

> 

Мы хотим, чтобы удалить лишние пробельные и разрывы строк внутри тега, то есть между < и >. Но не между элементами, поэтому он должен оставить это без изменений:

<div> 
    <span class="price">$100</span> 
    <span> 
     Word  word 
    </span> 
</div> 

Я получил this far:

html.gsub(/(?<=<)(\s{2,})(?>)/, ' ') 

Но это будет соответствовать только пробельные между < и >, если нет ничего другого, между ними.

Как я могу сопоставить пробелы между < и >, но разрешить другим символам?

ответ

1

Вы можете использовать matchdata object in gsub blocks:

html.gsub(/(?<=<)(.+)(?>)/m) { |match| match.gsub(/\n/, ' ').gsub(/\s+/, ' ') } 
+0

Это может быть слишком сложным, чтобы только 1 регулярное выражение, это работает намного лучше. Я изменил первое регулярное выражение, чтобы убедиться, что я только сопоставляю один тегг: '/ <([^>] +)> /' – pstenstrm

0

String#sqeeze спасает:

squeeze([other_str]*)new_str

Создает набор символов из параметра other_str (ы) с помощью процедуры, описанной для String#count. Возвращает новую строку, в которой прогоны того же символа, которые встречаются в этом наборе, заменяются одним символом. Если аргументы не заданы, все пробежки одинаковых символов заменяются одним символом.

"yellow moon".squeeze     #=> "yelow mon" 
" now is the".squeeze(" ")   #=> " now is the" 
"putters shoot balls".squeeze("m-z") #=> "puters shot balls" 
Смежные вопросы