2

我正在尝试缩小 HTML 字符串,但也要以一定的字符数包装文本。所以当 HTML 字符串包含嵌入的 CSS 时,我需要一个特殊的函数。我曾尝试使用 php 函数“wordwrap”,但它的双引号 (") 和单引号 (') 中的换行文本会破坏显示。例如,如果我们有以下字符串:

font-family: Arial, 'Helvetica Nueue', 'Times Roman'

现在,如果我们在 31 处对此进行自动换行,它将变为:

font-family: Arial, 'Helvetica
 Nueue', 'Times Roman'

这将导致浏览器在加载时误解 CSS 字符串。

有谁知道或已经编写了一个当文本包含在引号(单引号或双引号)中时不会换行的自动换行函数?

谢谢!

更新

很抱歉只要求代码。这就是我所设想的(我目前正在编程):

循环遍历 CSS 字符串并抓取中间的字符串块;} 或 { 如果它关闭了突破限制,则将子字符串添加到数组中。一旦循环完成,使用“\n”作为胶水将数组内爆成一个字符串。

有人有更好/不同的方法吗?

4

2 回答 2

1

PHPwordwrap函数对特定的 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);
于 2012-09-26T16:10:21.230 回答
0

如果您需要通过电子邮件发送此 HTML,您应该使用quoted_printable_encode()base64_encode()后跟chunk_split().

这两种方法都将确保行不超过 76 个字符。

不要忘记设置适当的Content-Transfer-EncodingMIME 标头,要么quoted-printable要么base64.

于 2012-09-26T16:11:15.970 回答