首页 > 解决方案 > 如何删除内联样式中的空格?

问题描述

我有一个生成 html 电子邮件的 php 脚本。为了优化大小以不违反 Google 的 102kB 限制,我试图从代码中挤出尽可能多的不必要字符。

我目前使用Emogrifier来内联 css,然后使用TinyMinify来缩小。

这个输出仍然在内联样式中的属性和值之间有空格(例如style="color: #ffffff; font-weight: 16px"

我开发了以下正则表达式来删除额外的空格,但它也会影响实际内容(例如,这个&那个变成这个&那个)

$out = preg_replace("/(;|:)\s([a-zA-Z0-9#])/", "$1$2", $newsletter);

如何修改此正则表达式以限制内联样式,还是有更好的方法?

标签: phpregexhtml-email

解决方案


没有不匹配有效负载(style=""可以出现在任何地方)和不匹配实际 CSS 值(如 中content: 'a: b')的防弹方法。此外还考虑

  • 缩短值:red短于#f00,短于#ff0000
  • 删除前导和尾随的虚假信息,例如空格和分号
  • 重新设计您的 HTML:即使用<ins>and<strong>可以有效地比使用内联 CSS 更短

一种方法是首先匹配所有内联样式的 HTML 属性,然后仅对其内容进行操作,但您必须自己测试它的效果如何:

$out= preg_replace_callback
( '/( style=")([^"]*)("[ >])/'  // Find all appropriate HTML attributes
, function( $aMatch ) {  // Per match
    // Kill any amount of any kind of spaces after colon or semicolon only
    $sInner= preg_replace
    ( '/([;:])\\s*([a-zA-Z0-9#])/'  // Escaping backslash in PHP string context
    , '$1$2'
    , $aMatch[2]  // Second sub match
    );

    // Kill any amount of leading and trailing semicolons and/or spaces
    $sInner= preg_replace
    ( array( '/^\\s*;*\\s*/', '/\\s*;*\\s*$/' )
    , ''
    , $sInner
    );

    return $aMatch[1]. $sInner. $aMatch[3];  // New HTML attribute
  }
, $newsletter
);

推荐阅读