2016-11-29 144 views
0

一些背景:我们正在为我们的Middleman项目添加一个样式指南。这是供其他开发人员使用的,所以我们希望我们的代码示例具有可读性。然而,当我们更改组件时,我们不想在多个地方更新代码。正则表达式在HTML标记中删除多个空格和换行符

我们使用redcarpet进行markdown解析并创建代码示例。

<%= 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

构建一组从使用用于String#count描述的过程参数other_str(多个)字符的。返回一个新字符串,其中发生在该集合中的相同字符的运行被单个字符替换。如果未给出参数,则所有相同字符的运行都由单个字符替换。

"yellow moon".squeeze     #=> "yelow mon" 
" now is the".squeeze(" ")   #=> " now is the" 
"putters shoot balls".squeeze("m-z") #=> "puters shot balls" 
相关问题