2012-03-25 58 views
0

我有一个将消息正文写入数据库的RoundCube插件,之后我需要将数据解析到另一个表中。通过使用RoundCube中的某些功能,我可以删除所有html标记,并且</td>被替换为'\ n',</tr>替换为'\ n \ n'。这使我的数据解析非常简单而且强大。仅存在一个缺点,在端的HTML数据被分成固定线与=,例如:从html中删除`= n`

<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=的没有得到认可,因此折扣接合到折后价格以下列方式折扣折后价折扣 \ 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> 

+1

搜索'decode quoted-printable',这就是你想要做的。除了删除等号和换行符之外,还有更多。 – dldnh 2012-03-25 12:57:41

+0

如果你str_replace('=','',$ msg_body);在str_replace('= \ n','',$ msg_body)之前; 通常不会有更多的= \ n来检测... – Kharaone 2012-03-25 13:02:11

+0

我一一使用它们,而不是全部3在一次去,但你是正确的,一个必须小心,把不必要的代码行。 – 2012-03-25 15:10:14

回答

-1

取决于您所使用的新换行符可以在系统上:

\n 
\r 
\r\n 

因此,检查这些辈

您还可以使用正则表达式,如果你知道有只选择标记的数量有问题:

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

在你的情况下,应该改造</td= ...><td>

0

对于具有适当地包括转义字符,你必须在PHP中使用双引号("):

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

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

4

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

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

更多的Wikipedia on quoted-printable

解码消息恢复正常HTML,你必须申请quoted_printable_decode()字符串。

$msg_body = quoted_printable_decode($msg_body); 
+0

这一行代码解决了我所有的痛苦!感谢这一点,我认为这是为了确保大多数电子邮件读者正确阅读电子邮件,他们仍然使用它,因为他们的网站使用最新的技术。 – 2012-03-25 15:05:15

+0

@JohanMarais多数民众赞成。别客气。如果它对你有帮助,请接受它作为正确的答案。谢谢。 http://stackoverflow.com/faq#howtoask – Kaii 2012-03-25 15:12:44