0

我有一个 RoundCube 插件,它将消息正文写入数据库,之后我需要将数据解析到另一个表中。通过使用 RoundCube 中的某些功能,我能够删除所有 html 标记,并且 a</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>

现在,</td='s 没有被识别,因此折扣以以下方式加入折扣后价格折扣后折扣\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>

, ETC。

4

3 回答 3

4

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

例如,在您的 HTML 标记中, 的=编码就像=3D您仔细查看它一样。

在 Wikipedia 上阅读更多关于引用打印的内容

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

$msg_body = quoted_printable_decode($msg_body);
于 2012-03-25T13:04:44.230 回答
0

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

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

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

于 2012-03-25T12:57:06.157 回答
-1

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

\n
\r
\r\n

所以也要检查那些

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

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

在你的情况下,它应该转换</td= ...><td>

于 2012-03-25T12:55:58.307 回答