猿问

如何删除内联样式中的空格?

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

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

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

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

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

如何修改此正则表达式以仅限于内联样式,或者是否有更好的方法?


哔哔one
浏览 144回答 2
2回答

元芳怎么了

没有防弹方法可以不匹配负载(style=""可以出现在任何地方)和不匹配实际 CSS 值(如 中所示content: 'a: b')。此外还要考虑缩短值:red短于#f00,短于#ff0000删除前导和尾随伪造,如空格和分号重新设计你的 HTML:即使用<ins>和<strong>可以有效地比使用内联 CSS 更短一种方法是首先匹配所有内联样式的 HTML 属性,然后仅对它们的内容进行操作,但您必须自己测试它的效果如何:$out= preg_replace_callback( '/( style=")([^"]*)("[ >])/'&nbsp; // Find all appropriate HTML attributes, function( $aMatch ) {&nbsp; // Per match&nbsp; &nbsp; // Kill any amount of any kind of spaces after colon or semicolon only&nbsp; &nbsp; $sInner= preg_replace&nbsp; &nbsp; ( '/([;:])\\s*([a-zA-Z0-9#])/'&nbsp; // Escaping backslash in PHP string context&nbsp; &nbsp; , '$1$2'&nbsp; &nbsp; , $aMatch[2]&nbsp; // Second sub match&nbsp; &nbsp; );&nbsp; &nbsp; // Kill any amount of leading and trailing semicolons and/or spaces&nbsp; &nbsp; $sInner= preg_replace&nbsp; &nbsp; ( array( '/^\\s*;*\\s*/', '/\\s*;*\\s*$/' )&nbsp; &nbsp; , ''&nbsp; &nbsp; , $sInner&nbsp; &nbsp; );&nbsp; &nbsp; return $aMatch[1]. $sInner. $aMatch[3];&nbsp; // New HTML attribute&nbsp; }, $newsletter);
随时随地看视频慕课网APP
我要回答