【问题标题】:Word wrap in PHP but don't wrap string inside quotesPHP中的自动换行,但不要将字符串包含在引号内
【发布时间】:2012-09-26 15:21:59
【问题描述】:

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

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

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

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

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

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

谢谢!

更新

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

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

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

【问题讨论】:

  • 你举的例子是错误的。 PHP 的wordwrap 函数的行为与您所说的不同。到目前为止,您还尝试过什么?请发布您的代码。
  • @hakra - 你是对的,我已经更新了我的问题。我还没有写任何东西……如果其他人已经解决了这个问题,我不想重新发明轮子。
  • 你只需要关心那个 CSS 片段。或者会不会有更多来自 CSS 语法的东西,比如双引号、括号等等?
  • 另外,您基本上只要求代码。这在这个网站上不太受欢迎。你应该展示——即使只是用伪代码——你将如何解决这个问题。
  • 如果您的目标是缩小 HTML 字符串,为什么还要关心自动换行?添加这些额外的换行符只会不必要地“膨胀”你的字符串。

标签: php string word-wrap


【解决方案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);

【讨论】:

    【解决方案2】:

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

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

    别忘了设置适当的Content-Transfer-Encoding MIME 标头,quoted-printablebase64

    【讨论】:

    • 这是一种有趣的方法,但不幸的是我不确定 ESP 将如何发送电子邮件,这就是为什么我更喜欢它是纯 HTML。
    • 什么是 ESP?我假设您是自己发送电子邮件,但通常电子邮件发送提供商已经应用了正确的包装。
    • @hakra 谢谢,想了很多:) 在这种情况下,这可能不是问题。
    猜你喜欢
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 2020-01-03
    • 2021-05-15
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多