php - 如何删除内联样式中的空格?
问题描述
我有一个生成 html 电子邮件的 php 脚本。为了优化大小以不违反 Google 的 102kB 限制,我试图从代码中挤出尽可能多的不必要字符。
我目前使用Emogrifier来内联 css,然后使用TinyMinify来缩小。
这个输出仍然在内联样式中的属性和值之间有空格(例如style="color: #ffffff; font-weight: 16px"
)
我开发了以下正则表达式来删除额外的空格,但它也会影响实际内容(例如,这个&那个变成这个&那个)
$out = preg_replace("/(;|:)\s([a-zA-Z0-9#])/", "$1$2", $newsletter);
如何修改此正则表达式以限制内联样式,还是有更好的方法?
解决方案
没有不匹配有效负载(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
);
推荐阅读
- android - Flutter:同时使用 Pan 和 Scale 手势?
- python - Mongoengine 检查连接是否成功
- flutter - 在富文本颤动中使用图标时,如何垂直对齐图标
- python - 在哪里查看 Swarm 负载均衡器日志?
- javascript - 根据 Flask 微服务的进度创建 React JS 进度条?
- java - 使用 Java-8 对数组中的数字进行排序而不更改偶数位置
- julia - 在 Julia 中使用 NTuple 参数类型与使用抽象向量
- awk - 如何拒绝以awk中的某些文本开头的字符串?
- regex - regexp 语句中没有前面的字符
- mysql - 如何从 MySQL 查询中的电子邮件地址中删除“加号”标签?