在PHP中自动换行,但不要在引号内包装字符串

时间:2012-09-26 15:22:00

标签: php string word-wrap

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

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

现在,如果我们对31进行自动翻译,它将成为:

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

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

当文本包含在引号(单引号或双引号)中时,是否有人知道如何编写一个不会换行的wordwrap函数?

谢谢!

更新

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

循环遍历CSS字符串并抓取其间的字符串块; }或{如果它接近中断限制,则将子串添加到数组中。循环完成后,使用“\ n”作为粘合剂将数组内爆为字符串。

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

2 个答案:

答案 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-printablebase64