【问题标题】:Remove `=\n` from html从 html 中删除 `=\n`
【发布时间】:2012-04-09 06:07:27
【问题描述】:

我有一个 RoundCube 插件,它将消息正文写入数据库,之后我需要将数据解析到另一个表中。通过使用 RoundCube 中的某些功能,我能够删除所有 html 标签,</td> 被替换为“\n”,</tr> 被替换为“\n\n”。这使得我的数据解析变得非常容易和健壮。只有一个缺点,html 数据被分成固定行,末尾带有=,例如:

<td valign=3D"bottom" style=3D"color:#444444;padding:5px 10px 5=
px 0px;font-size:12px;border-bottom:1px solid #eeeeee;"><b>Discount</b></td=
><td valign=3D"bottom" align=3D"right" style=3D"color:#444444;padding:5px 0=
px 5px 0px;font-size:12px;border-bottom:1px solid #eeeeee;text-align:right;=
"><b>Price after discount</b></td>

现在,&lt;/td= 未被识别,因此 Discount 以下列方式加入 Price after discount DiscountPrice after discount\n,而不是折扣\n 折扣后价格\n。这一直贯穿代码,确实给我带来了严重的问题。

我试图删除 = 并打破以下内容:

$msg_body = str_replace('=', '', $msg_body);
$msg_body = str_replace('=\n', '', $msg_body);
$msg_body = str_replace('= ', '', $msg_body);

没有真正的成功。我不知道 = 符号后面是哪种类型的中断,是换行符还是分段符并试图找出来,但徒劳无功,甚至查看了 RoundCube 代码。回显 html 也没有向我透露任何信息。

我在这里发布这个作为一般的 php 和 html 问题,希望有人可以帮助我简单地删除这些 = 符号和神秘的(对我而言)中断,以便

</td=
>

变成

</td>

【问题讨论】:

  • 搜索decode quoted-printable,这就是你想要做的。它不仅仅是删除等号和换行符。
  • 如果你 str_replace('=', '', $msg_body);之前 str_replace('=\n', '', $msg_body);通常没有更多 =\n 可检测...
  • 我一个一个地使用了它们,而不是一次全部使用了 3 个,但是你说得对,必须小心放入不必要的代码行。
  • 删除换行符和等号只是一个临时解决方案,因为我不知道我需要删除什么,而 decode quoted-printable 是我需要的东西。

标签: php html email mime quoted-printable


【解决方案1】:

根据您使用的系统,换行符可以是:

\n
\r
\r\n

所以也要检查那些

如果您知道只有选定数量的标记存在问题,您也可以使用正则表达式:

$msg_body = preg_replace('/(\w+)=[\s\r\n]*/', '$1', $msg_body);

在您的情况下,它应该将&lt;/td= ...&gt; 转换为&lt;td&gt;

【讨论】:

    【解决方案2】:

    为了正确包含转义字符,您必须在 PHP 中使用双引号 ("):

    $msg_body = str_replace("=\n", '', $msg_body);
    

    否则,PHP 将查找字符串 =\n

    【讨论】:

      【解决方案3】:

      =XY 表示法是(老派但仍在使用!)quoted-printable 编码的一部分,它表示 7 位 ASC 代码集中的 8 位 ASCII 字符串。所有大于 127 的字符都以=F3 的形式编码,这是字符的十六进制表示。

      例如,在您的 HTML 标记中,= 被编码为 =3D,如果您仔细查看的话。

      阅读更多Wikipedia on quoted-printable

      要将消息解码回普通 HTML,您必须将 quoted_printable_decode() 应用于字符串。

      $msg_body = quoted_printable_decode($msg_body);
      

      【讨论】:

      • 这一行代码解决了我所有的痛苦!!谢谢你,我认为这是为了确保大多数电子邮件阅读者正确阅读电子邮件,因为他们的网站使用了最新的技术,所以他们仍然使用它。
      • @JohanMarais 没错。不客气。如果对您有帮助,请接受此作为正确答案。谢谢。 stackoverflow.com/faq#howtoask
      猜你喜欢
      • 2014-06-03
      • 2014-12-12
      • 1970-01-01
      • 1970-01-01
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 2018-05-03
      相关资源
      最近更新 更多