我继承了一个MySQL数据库,其中包含在Microsoft Outlook(Windows和Mac OS X版本)中生成的电子邮件主题和邮件正文。
当我尝试使用PHP从数据库中提取消息正文然后对它们运行json_encode
时,JSON中有许多(非转义的)换行符,从而使输出无效。
我之前从未见过这个,但经过进一步的调查,我意识到换行的每个实例都在<style>
标记和</style>
标记之间,(看似)除了它们之间没有任何内容换行。
然后我运行preg_match
来捕获一组style
标记之间的空格/换行符。执行此操作并在结果上运行strlen
后,我返回了数字2460
。
然后我循环遍历捕获的&#34;空白中的每个角色&#34;并试图输出它们。起初,我只看到空格,但是当我在每个字符之间添加"\n"
时,我突然看到以下输出(减去一些潜在的前导和尾随空格):
<
!
-
-
/
*
F
o
n
t
D
e
f
i
n
i
t
i
o
n
s
*
/
@
f
o
n
t
-
f
a
c
e
{
f
o
n
t
-
f
a
m
i
l
y
:
H
e
l
v
e
t
i
c
a
;
p
a
n
o
s
e
-
1
:
2
1
1
6
4
2
2
2
2
2
4
;
}
@
f
o
n
t
-
f
a
c
e
{
f
o
n
t
-
f
a
m
i
l
y
:
H
e
l
v
e
t
i
c
a
;
p
a
n
o
s
e
-
1
:
2
1
1
6
4
2
2
2
2
2
4
;
}
@
f
o
n
t
-
f
a
c
e
{
f
o
n
t
-
f
a
m
i
l
y
:
C
a
l
i
b
r
i
;
p
a
n
o
s
e
-
1
:
2
1
5
5
2
2
2
4
3
2
4
;
}
@
f
o
n
t
-
f
a
c
e
{
f
o
n
t
-
f
a
m
i
l
y
:
T
a
h
o
m
a
;
p
a
n
o
s
e
-
1
:
2
1
1
6
4
3
5
4
4
2
4
;
}
@
f
o
n
t
-
f
a
c
e
{
f
o
n
t
-
f
a
m
i
l
y
:
C
o
n
s
o
l
a
s
;
p
a
n
o
s
e
-
1
:
2
1
1
6
9
2
2
4
3
2
4
;
}
/
*
S
t
y
l
e
D
e
f
i
n
i
t
i
o
n
s
*
/
p
.
M
s
o
N
o
r
m
a
l
,
l
i
.
M
s
o
N
o
r
m
a
l
,
d
i
v
.
M
s
o
N
o
r
m
a
l
{
m
a
r
g
i
n
:
0
i
n
;
m
a
r
g
i
n
-
b
o
t
t
o
m
:
.
0
0
0
1
p
t
;
f
o
n
t
-
s
i
z
e
:
1
2
.
0
p
t
;
f
o
n
t
-
f
a
m
i
l
y
:
"
T
i
m
e
s
N
e
w
R
o
m
a
n
"
,
"
s
e
r
i
f
"
;
}
a
:
l
i
n
k
,
s
p
a
n
.
M
s
o
H
y
p
e
r
l
i
n
k
{
m
s
o
-
s
t
y
l
e
-
p
r
i
o
r
i
t
y
:
9
9
;
c
o
l
o
r
:
b
l
u
e
;
t
e
x
t
-
d
e
c
o
r
a
t
i
o
n
:
u
n
d
e
r
l
i
n
e
;
}
a
:
v
i
s
i
t
e
d
,
s
p
a
n
.
M
s
o
H
y
p
e
r
l
i
n
k
F
o
l
l
o
w
e
d
{
m
s
o
-
s
t
y
l
e
-
p
r
i
o
r
i
t
y
:
9
9
;
c
o
l
o
r
:
p
u
r
p
l
e
;
t
e
x
t
-
d
e
c
o
r
a
t
i
o
n
:
u
n
d
e
r
l
i
n
e
;
}
p
.
M
s
o
P
l
a
i
n
T
e
x
t
,
l
i
.
M
s
o
P
l
a
i
n
T
e
x
t
,
d
i
v
.
M
s
o
P
l
a
i
n
T
e
x
t
{
m
s
o
-
s
t
y
l
e
-
p
r
i
o
r
i
t
y
:
9
9
;
m
s
o
-
s
t
y
l
e
-
l
i
n
k
:
"
P
l
a
i
n
T
e
x
t
C
h
a
r
"
;
m
a
r
g
i
n
:
0
i
n
;
m
a
r
g
i
n
-
b
o
t
t
o
m
:
.
0
0
0
1
p
t
;
f
o
n
t
-
s
i
z
e
:
1
0
.
5
p
t
;
f
o
n
t
-
f
a
m
i
l
y
:
C
o
n
s
o
l
a
s
;
}
p
{
m
s
o
-
s
t
y
l
e
-
p
r
i
o
r
i
t
y
:
9
9
;
m
a
r
g
i
n
:
0
i
n
;
m
a
r
g
i
n
-
b
o
t
t
o
m
:
.
0
0
0
1
p
t
;
f
o
n
t
-
s
i
z
e
:
1
2
.
0
p
t
;
f
o
n
t
-
f
a
m
i
l
y
:
"
T
i
m
e
s
N
e
w
R
o
m
a
n
"
,
"
s
e
r
i
f
"
;
}
p
.
M
s
o
A
c
e
t
a
t
e
,
l
i
.
M
s
o
A
c
e
t
a
t
e
,
d
i
v
.
M
s
o
A
c
e
t
a
t
e
{
m
s
o
-
s
t
y
l
e
-
p
r
i
o
r
i
t
y
:
9
9
;
m
s
o
-
s
t
y
l
e
-
l
i
n
k
:
"
B
a
l
l
o
o
n
T
e
x
t
C
h
a
r
"
;
m
a
r
g
i
n
:
0
i
n
;
m
a
r
g
i
n
-
b
o
t
t
o
m
:
.
0
0
0
1
p
t
;
f
o
n
t
-
s
i
z
e
:
8
.
0
p
t
;
f
o
n
t
-
f
a
m
i
l
y
:
"
T
a
h
o
m
a
"
,
"
s
a
n
s
-
s
e
r
i
f
"
;
}
s
p
a
n
.
P
l
a
i
n
T
e
x
t
C
h
a
r
{
m
s
o
-
s
t
y
l
e
-
n
a
m
e
:
"
P
l
a
i
n
T
e
x
t
C
h
a
r
"
;
m
s
o
-
s
t
y
l
e
-
p
r
i
o
r
i
t
y
:
9
9
;
m
s
o
-
s
t
y
l
e
-
l
i
n
k
:
"
P
l
a
i
n
T
e
x
t
"
;
f
o
n
t
-
f
a
m
i
l
y
:
C
o
n
s
o
l
a
s
;
}
s
p
a
n
.
B
a
l
l
o
o
n
T
e
x
t
C
h
a
r
{
m
s
o
-
s
t
y
l
e
-
n
a
m
e
:
"
B
a
l
l
o
o
n
T
e
x
t
C
h
a
r
"
;
m
s
o
-
s
t
y
l
e
-
p
r
i
o
r
i
t
y
:
9
9
;
m
s
o
-
s
t
y
l
e
-
l
i
n
k
:
"
B
a
l
l
o
o
n
T
e
x
t
"
;
f
o
n
t
-
f
a
m
i
l
y
:
"
T
a
h
o
m
a
"
,
"
s
a
n
s
-
s
e
r
i
f
"
;
}
p
.
m
s
o
c
h
p
d
e
f
a
u
l
t
,
l
i
.
m
s
o
c
h
p
d
e
f
a
u
l
t
,
d
i
v
.
m
s
o
c
h
p
d
e
f
a
u
l
t
{
m
s
o
-
s
t
y
l
e
-
n
a
m
e
:
m
s
o
c
h
p
d
e
f
a
u
l
t
;
m
a
r
g
i
n
:
0
i
n
;
m
a
r
g
i
n
-
b
o
t
t
o
m
:
.
0
0
0
1
p
t
;
f
o
n
t
-
s
i
z
e
:
1
0
.
0
p
t
;
f
o
n
t
-
f
a
m
i
l
y
:
"
T
i
m
e
s
N
e
w
R
o
m
a
n
"
,
"
s
e
r
i
f
"
;
}
s
p
a
n
.
p
l
a
i
n
t
e
x
t
c
h
a
r
0
{
m
s
o
-
s
t
y
l
e
-
n
a
m
e
:
p
l
a
i
n
t
e
x
t
c
h
a
r
;
f
o
n
t
-
f
a
m
i
l
y
:
C
o
n
s
o
l
a
s
;
}
s
p
a
n
.
b
a
l
l
o
o
n
t
e
x
t
c
h
a
r
0
{
m
s
o
-
s
t
y
l
e
-
n
a
m
e
:
b
a
l
l
o
o
n
t
e
x
t
c
h
a
r
;
f
o
n
t
-
f
a
m
i
l
y
:
"
T
a
h
o
m
a
"
,
"
s
a
n
s
-
s
e
r
i
f
"
;
}
s
p
a
n
.
e
m
a
i
l
s
t
y
l
e
2
2
{
m
s
o
-
s
t
y
l
e
-
n
a
m
e
:
e
m
a
i
l
s
t
y
l
e
2
2
;
f
o
n
t
-
f
a
m
i
l
y
:
"
C
a
l
i
b
r
i
"
,
"
s
a
n
s
-
s
e
r
i
f
"
;
c
o
l
o
r
:
b
l
a
c
k
;
}
s
p
a
n
.
e
m
a
i
l
s
t
y
l
e
2
3
{
m
s
o
-
s
t
y
l
e
-
n
a
m
e
:
e
m
a
i
l
s
t
y
l
e
2
3
;
f
o
n
t
-
f
a
m
i
l
y
:
"
C
a
l
i
b
r
i
"
,
"
s
a
n
s
-
s
e
r
i
f
"
;
c
o
l
o
r
:
#
1
F
4
9
7
D
;
}
s
p
a
n
.
E
m
a
i
l
S
t
y
l
e
2
7
{
m
s
o
-
s
t
y
l
e
-
t
y
p
e
:
p
e
r
s
o
n
a
l
-
r
e
p
l
y
;
f
o
n
t
-
f
a
m
i
l
y
:
"
C
a
l
i
b
r
i
"
,
"
s
a
n
s
-
s
e
r
i
f
"
;
c
o
l
o
r
:
#
1
F
4
9
7
D
;
}
.
M
s
o
C
h
p
D
e
f
a
u
l
t
{
m
s
o
-
s
t
y
l
e
-
t
y
p
e
:
e
x
p
o
r
t
-
o
n
l
y
;
f
o
n
t
-
s
i
z
e
:
1
0
.
0
p
t
;
}
@
p
a
g
e
W
o
r
d
S
e
c
t
i
o
n
1
{
s
i
z
e
:
8
.
5
i
n
1
1
.
0
i
n
;
m
a
r
g
i
n
:
1
.
0
i
n
1
.
0
i
n
1
.
0
i
n
1
.
0
i
n
;
}
d
i
v
.
W
o
r
d
S
e
c
t
i
o
n
1
{
p
a
g
e
:
W
o
r
d
S
e
c
t
i
o
n
1
;
}
-
-
>
以下是没有换行符的输出:
<!--/* Font Definitions */@font-face {font-family:Helvetica; panose-1:2 11 6 4 2 2 2 2 2 4;}@font-face {font-family:Helvetica; panose-1:2 11 6 4 2 2 2 2 2 4;}@font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4;}@font-face {font-family:Tahoma; panose-1:2 11 6 4 3 5 4 4 2 4;}@font-face {font-family:Consolas; panose-1:2 11 6 9 2 2 4 3 2 4;}/* Style Definitions */p.MsoNormal, li.MsoNormal, div.MsoNormal {margin:0in; margin-bottom:.0001pt; font-size:12.0pt; font-family:"Times New Roman","serif";}a:link, span.MsoHyperlink {mso-style-priority:99; color:blue; text-decoration:underline;}a:visited, span.MsoHyperlinkFollowed {mso-style-priority:99; color:purple; text-decoration:underline;}p.MsoPlainText, li.MsoPlainText, div.MsoPlainText {mso-style-priority:99; mso-style-link:"Plain Text Char"; margin:0in; margin-bottom:.0001pt; font-size:10.5pt; font-family:Consolas;}p {mso-style-priority:99; margin:0in; margin-bottom:.0001pt; font-size:12.0pt; font-family:"Times New Roman","serif";}p.MsoAcetate, li.MsoAcetate, div.MsoAcetate {mso-style-priority:99; mso-style-link:"Balloon Text Char"; margin:0in; margin-bottom:.0001pt; font-size:8.0pt; font-family:"Tahoma","sans-serif";}span.PlainTextChar {mso-style-name:"Plain Text Char"; mso-style-priority:99; mso-style-link:"Plain Text"; font-family:Consolas;}span.BalloonTextChar {mso-style-name:"Balloon Text Char"; mso-style-priority:99; mso-style-link:"Balloon Text"; font-family:"Tahoma","sans-serif";}p.msochpdefault, li.msochpdefault, div.msochpdefault {mso-style-name:msochpdefault; margin:0in; margin-bottom:.0001pt; font-size:10.0pt; font-family:"Times New Roman","serif";}span.plaintextchar0 {mso-style-name:plaintextchar; font-family:Consolas;}span.balloontextchar0 {mso-style-name:balloontextchar; font-family:"Tahoma","sans-serif";}span.emailstyle22 {mso-style-name:emailstyle22; font-family:"Calibri","sans-serif"; color:black;}span.emailstyle23 {mso-style-name:emailstyle23; font-family:"Calibri","sans-serif"; color:#1F497D;}span.EmailStyle27 {mso-style-type:personal-reply; font-family:"Calibri","sans-serif"; color:#1F497D;}.MsoChpDefault {mso-style-type:export-only; font-size:10.0pt;}@page WordSection1 {size:8.5in 11.0in; margin:1.0in 1.0in 1.0in 1.0in;}div.WordSection1 {page:WordSection1;}-->
在做了一些研究之后,这似乎是由Microsoft Office产品(包括Outlook)创建的一些样式标记。令我感到困惑的是,当我循环遍历字符串中的每个字符并在它们之间输出换行符时,我只能看到这些字符。
让我感到震惊的是如何检测这些字符并将其删除,以便在没有换行符的情况下正确格式化JSON输出。
我尝试在每个电子邮件正文中运行preg_replace('!\s!', $email_msg_body)
之类的内容,但出于某种原因,style
代码之间的换行仍然存在。
最终,我正在寻找一种方法来正确格式化JSON字符串,以便我可以输出它。不仅如此,我想了解为什么会发生这种情况以及如何在将来发生这种情况。
可悲的是,因为我从其他人那里继承了这个数据库,所以我不知道如何首先设置将Outlook电子邮件移动到数据库的订阅源。
DB也是latin1
编码的。起初,我认为隐藏的字符串可能包含无效的ASCII字符,但在对字符串中的每个字符运行ord
之后,似乎并非如此。
非常感谢任何帮助 谢谢。
答案 0 :(得分:0)
我终于弄清楚发生了什么。它与MS Outlook输出的隐藏字符无关。
这完全与我使用带有回调函数的ob_start
函数以某种方式格式化缓冲区这一事实有关,因此两个HTML标记之间的任何空格都被替换为换行符。由于MS Outlook输出中的标记,因此问题由json_encode
格式化后,这自然会导致换行符放入我的JSON字符串中,因此问题就出现了。
傻傻的我!