正则表达式:如何只删除样式属性中的空格?

时间:2010-09-13 23:27:00

标签: html css regex textmate

在过去的一个小时里,我一直试图弄清楚这一点,但我没有取得任何成功,想到也许你可以提供帮助。

基本上我有一个html电子邮件文档,它有很多style属性,用于内联样式的元素看起来有点像

<th rowspan="10" style="font-weight: normal; vertical-align: top; text-align: left;" width="87">

现在我需要做的是删除所有空白区域,使其变为:

<th rowspan="10" style="font-weight:normal;vertical-align:top;text-align:left;" width="87">

http://www.gskinner.com/RegExr/中玩耍我找到了这个搜索表达式

/style="([\w ;:\-0-9]+)"/gi

只匹配样式属性和内容,但我似乎无法弄清楚如何仅在$ 1捕获组中替换空格。

最终,我会在项目范围内运行此项,以便在重要的情况下在TextMate中进行查找和替换。

如果您没有注意到我是RegEx的新手,请尝试解释您的解决方案,以便我们可以从中学习以供将来参考。

非常感谢阅读,

Jannis

2 个答案:

答案 0 :(得分:3)

注意速记属性。例如,在

style="background: #fff; border: 1px solid #ccc"

...您可以安全地删除前三个空格,但必须保留最后两个,分隔border:速记值的组成部分。只是为了好玩,这里有一个正则表达式,它删除与属性名称和:;分隔符相邻的任何空格,但不包含属性值:

((?:\sstyle="|(?!\A)\G))\s*+([a-z]++(?>-[a-z]+)*+)\s*+:\s*+([^;]+?)\s*+;

替换为:

$1$2:$3;

在EditPad Pro中测试它,它会转换它(353个字符):

<th rowspan="10" style="font-weight: normal; vertical-align: top; text-align: left;" width="87"><input title="Search" value="" size=57 style="background: #fff; border: 1px solid #ccc ; border-bottom-color: #999; border-right-color:#999;color: #000; font: 18px arial,sans-serif bold; height: 25px; margin: 0; padding: 5px 8px 0 6px; vertical-align: top">

......对此(330个字符):

<th rowspan="10" style="font-weight:normal;vertical-align:top;text-align:left;" width="87"><input title="Search" value="" size=57 style="background:#fff;border:1px solid #ccc;border-bottom-color:#999;border-right-color:#999;color:#000;font:18px arial,sans-serif bold;height:25px;margin:0;padding:5px 8px 0 6px;vertical-align:top">

但我不建议你使用这个或任何正则表达式解决方案;我只是好奇它是否像在EditPad中一样在TextMate中工作。 (TextMate使用Oniguruma正则表达式引擎,它支持所有必要的功能,因此它应该可以工作,但我不能自己测试它。)

但你真正应该用于这项工作的是专用的CSS压缩器/最小化器/缩小器;那里有很多。

答案 1 :(得分:1)

这是一个非常棘手的问题。无法找到执行此操作的单个正则表达式,但您可以使用一系列正则表达式执行此操作:

  1. 打破这些行,以便style="blabla"出现在单独的行中。 (用特殊字符串标记分隔的行,以便稍后重新加入)。
  2. style="blabla"行进行操作。
  3. 重新加入
  4. 清除剩余的特殊标记。

    这是我用sed做的方式(希望转换为textmate regexp样式很简单):

  5. sed -e 's/\(.*\)\(style="[^"]*"\)\(.*\)/AAA\1\nBBB\2\nCCC\3/g' test.txt | sed '/BBB/s/ //g' | sed -e :a -e '$!N;s/\nBBB//;ta' -e 'P;D' | sed -e :a -e '$!N;s/\nCCC//;ta' -e 'P;D' | sed -e 's/AAA//g'

    说明:

    sed -e 's/\(.*\)\(style="[^"]*"\)\(.*\)/AAA\1\nBBB\2\nCCC\3/g' test.txt
    

    将带有style =“...”的行分成3行,并用特殊字符串AAA,BBB和CCC标记。 它会导致文件如下:

    AAA line before style
    BBB line with style=""
    CCC line after style
    

    然后我们应用下一个正则表达式:

    sed '/BBB/s/ //g'
    

    删除以BBB开头的所有行中的空格(即样式行)

    然后我们重新加入:

    sed -e :a -e '$!N;s/\nBBB//;ta' -e 'P;D'
    

    将以BBB开头的行追加到前一行(并删除字符串BBB)

    然后:

    sed -e :a -e '$!N;s/\nCCC//;ta' -e 'P;D'
    

    将以CCC开头的行追加到前一行。

    最后:

    sed -e 's/AAA//g'
    

    删除特殊字符串AAA。

    这肯定是次优的,可以使用regexp以外的方法以更少的努力完成。 (甚至还有用于自动格式化源代码的工具)。 无论如何,这是我能在一小时内做到的。我确信只有一个正则表达式能够满足您的需求,而且很难找到它。