我正在尝试缩小HTML字符串,但也会将文本换行为特定的字符数。所以当HTML字符串包含嵌入的CSS时,我需要一个特殊的函数。我已经尝试使用php函数“wordwrap”但它的包装文本在双引号(“)和单引号(')中打破了显示。例如,如果我们有以下字符串:
font-family: Arial, 'Helvetica Nueue', 'Times Roman'
现在,如果我们对31进行自动翻译,它将成为:
font-family: Arial, 'Helvetica
Nueue', 'Times Roman'
这会导致浏览器在加载时误解CSS字符串。
当文本包含在引号(单引号或双引号)中时,是否有人知道如何编写一个不会换行的wordwrap函数?
谢谢!
更新
很抱歉只要求代码。这就是我所设想的(我目前正致力于编程):
循环遍历CSS字符串并抓取其间的字符串块; }或{如果它接近中断限制,则将子串添加到数组中。循环完成后,使用“\ n”作为粘合剂将数组内爆为字符串。
任何人都有更好/不同的方法吗?
答案 0 :(得分:1)
PHP wordwrap
函数对特定的ASCII字符有一些了解。
在示例文本中,您不希望允许单引号内的空格换行,因此您只需用不间断空格替换空格即可。 wordwrap
将不再包裹那些:
$nowrap = function ($string) {
return str_replace(' ', "\xA0", $string);
};
这是这种“nowrap”功能的ASCII版本。
由于它只需要部分应用于单引号部分,因此需要获得这些部分。这可以通过正则表达式轻松完成:
/'[^']+'/
要将nowrap函数应用于匹配,但是需要一个辅助函数将第一个匹配组映射到输入值:
$first = function ($callback) {
return function ($params) use ($callback) {
return $callback($params[0]);
};
};
然后这很容易应用:
$quotes = "/'[^']+'/";
$subject = preg_replace_callback($quotes, $first($nowrap), $subject);
然后,您可以安全地应用wordwrap
函数,例如wordwrap($subject, 31)
将提供以下输出:
font-family: Arial,
'Helvetica Nueue',
'Times Roman'
如果您不希望在输出中包含这些内容,也可以将其转换回来。
完整的代码:
$subject = "font-family: Arial, 'Helvetica Nueue', 'Times Roman'";
$nowrap = function ($string) {
return str_replace(' ', "\xA0", $string);
};
$first = function ($callback) {
return function ($params) use ($callback) {
return $callback($params[0]);
};
};
$quotes = "/'[^']+'/";
$subject = preg_replace_callback($quotes, $first($nowrap), $subject);
echo wordwrap($subject, 31);
答案 1 :(得分:0)
如果您需要通过电子邮件发送此HTML,则应使用quoted_printable_encode()
或base64_encode()
,然后使用chunk_split()
。
这两种方法都会确保这些行不超过76个字符。
不要忘记设置相应的Content-Transfer-Encoding
MIME标头,quoted-printable
或base64
。