【问题标题】:Regex remove multiple whitespace and line-break inside HTML tag正则表达式删除 HTML 标记内的多个空格和换行符
【发布时间】:2017-04-13 05:06:10
【问题描述】:

一些背景知识:我们正在向 Middleman 项目添加样式指南。它是供其他开发人员使用的,因此我们希望我们的代码示例具有可读性。但是,我们不希望在更改组件时必须在多个地方更新代码。

我们使用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"

>

我们要删除标记内多余的空格和换行符,即&lt;&gt; 之间。但不是在元素之间,所以它应该保持不变:

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

我已经收到this far:

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

但它只会匹配 &lt;&gt; 之间的空格,前提是两者之间没有其他内容。

如何匹配 &lt;&gt; 之间的空格,但同时允许其他字符?

【问题讨论】:

    标签: html ruby regex


    【解决方案1】:

    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"
    

    【讨论】:

      【解决方案2】:

      您可以使用matchdata object in gsub blocks:

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

      【讨论】:

      • 只有 1 个正则表达式可能过于复杂,这会更好。我更改了第一个正则表达式以确保我只匹配一个标签:/&lt;([^&gt;]+)&gt;/
      猜你喜欢
      • 1970-01-01
      • 2019-06-21
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      • 2021-04-10
      • 1970-01-01
      相关资源
      最近更新 更多