<span><?php
</span><span>
</span><span>
class
</span>mhtparse {
<span>
var
</span><span>
$file
</span><span>= </span><span>
''
</span><span>;
</span><span>
var
</span><span>
$boundary
</span><span>= </span><span>
''
</span><span>;
</span><span>
var
</span><span>
$filedata
</span><span>= </span><span>
''
</span><span>;
</span><span>
var
</span><span>
$countparts
</span><span>= </span><span>1</span><span>;
</span><span>
var
</span><span>
$log
</span><span>= </span><span>
''
</span><span>;
</span><span>
function
</span>extract() {
<span>
$this
</span><span>-></span>read_filedata ()<span>;
</span><span>
$this
</span><span>-></span>file_parts ()<span>;
</span><span>
return
</span><span>1</span><span>;
</span>}
<span>
function
</span>set_file(<span>
$p
</span>) {
<span>
$this
</span><span>-></span>file <span>= </span><span>
$p
</span><span>;
</span>}
<span>
function
</span>get_log() {
<span>
return
</span><span>
$this
</span><span>-></span>log<span>;
</span>}
<span>
function
</span>file_parts() {
<span>
$lines
</span><span>= </span>
explode
( <span>
"</span><span>\n</span><span>"
</span>,
substr
( <span>
$this
</span><span>-></span>filedata, <span>0</span>, <span>8192 </span>) )<span>;
</span><span>
foreach
</span>( <span>
$lines
</span><span>
as
</span><span>
$line
</span>) {
<span>
$line
</span><span>= </span>trim ( <span>
$line
</span>)<span>;
</span><span>
if
</span>(
strpos
( <span>
$line
</span>, <span>
'='
</span>) <span>!== </span><span>FALSE</span>) {
<span>
if
</span>(
strpos
( <span>
$line
</span>, <span>
'boundary'
</span>, <span>0 </span>) <span>!== </span><span>FALSE</span>) {
<span>
$range
</span><span>= </span><span>
$this
</span><span>-></span>getrange ( <span>
$line
</span>, <span>
'"'
</span>, <span>
'"'
</span>, <span>0 </span>)<span>;
</span><span>
$this
</span><span>-></span>boundary <span>= </span><span>
"--"
</span><span>. </span><span>
$range
</span><span>[</span><span>
'range'
</span><span>]</span><span>;
</span><span>
$this
</span><span>-></span>filedata <span>= </span>
str_replace
( <span>
$line
</span>, <span>
''
</span>, <span>
$this
</span><span>-></span>filedata )<span>;
</span><span>
break
</span><span>;
</span>}
}
}
<span>
if
</span>(<span>
$this
</span><span>-></span>boundary <span>!= </span><span>
''
</span>) {
<span>
$this
</span><span>-></span>filedata <span>= </span>
explode
( <span>
$this
</span><span>-></span>boundary, <span>
$this
</span><span>-></span>filedata )<span>;
</span><span>unset </span>( <span>
$this
</span><span>-></span>filedata <span>[</span><span>0</span><span>] </span>)<span>;
</span><span>
$this
</span><span>-></span>filedata <span>= </span>
array_values
( <span>
$this
</span><span>-></span>filedata )<span>;
</span><span>
$this
</span><span>-></span>countparts <span>= </span>
count
( <span>
$this
</span><span>-></span>filedata )<span>;
</span>} <span>
else
</span>{
<span>
$tmp
</span><span>= </span><span>
$this
</span><span>-></span>filedata<span>;
</span><span>
$this
</span><span>-></span>filedata <span>= </span><span>
array
</span>(
<span>
$tmp
</span>)<span>;
</span>}
}
<span>
function
</span>get_all_part_file() {
<span>
return
</span><span>
$this
</span><span>-></span>filedata<span>;
</span>}
<span>
function
</span>get_part_to_file(<span>
$i
</span>) {
<span>
$line_dat
<strong>a_star</strong>t </span><span>= </span><span>0</span><span>;
</span><span>
$encoding
</span><span>= </span><span>
''
</span><span>;
</span><span>
$part_lines
</span><span>= </span>
explode
( <span>
"</span><span>\n</span><span>"
</span>, ltrim ( <span>
$this
</span><span>-></span>filedata <span>[</span><span>
$i
</span><span>] </span>) )<span>;
</span><span>
foreach
</span>( <span>
$part_lines
</span><span>
as
</span><span>
$line_id
</span>=> <span>
$line
</span>) {
<span>
$line
</span><span>= </span>trim ( <span>
$line
</span>)<span>;
</span><span>
if
</span>(<span>
$line
</span><span>== </span><span>
''
</span>) {
<span>
if
</span>(trim ( <span>
$part_lines
</span><span>[</span><span>0</span><span>] </span>) <span>== </span><span>
'--'
</span>)
<span>
return
</span><span>1</span><span>;
</span><span>
$line_dat
<strong>a_star</strong>t </span><span>= </span><span>
$line_id
</span><span>;
</span><span>
break
</span><span>;
</span>}
<span>
if
</span>(
strpos
( <span>
$line
</span>, <span>
':'
</span>) <span>!== </span><span>FALSE</span>) {
<span>
$pos
</span><span>= </span>
strpos
( <span>
$line
</span>, <span>
':'
</span>)<span>;
</span><span>
$k
</span><span>= </span>
strtolower
( trim (
substr
( <span>
$line
</span>, <span>0</span>, <span>
$pos
</span>) ) )<span>;
</span><span>
$v
</span><span>= </span>trim (
substr
( <span>
$line
</span>, <span>
$pos
</span><span>+ </span><span>1</span>,
strlen
( <span>
$line
</span>) ) )<span>;
</span><span>
if
</span>(<span>
$k
</span><span>== </span><span>
'content-transfer-encoding'
</span>) {
<span>
$encoding
</span><span>= </span><span>
$v
</span><span>;
</span>}
<span>
if
</span>(<span>
$k
</span><span>== </span><span>
'content-location'
</span>) {
<span>
$location
</span><span>= </span><span>
$v
</span><span>;
</span>}
<span>
if
</span>(<span>
$k
</span><span>== </span><span>
'content-type'
</span>) {
<span>
$contenttype
</span><span>= </span><span>
$v
</span><span>;
</span>}
}
}
<span>
foreach
</span>( <span>
$part_lines
</span><span>
as
</span><span>
$line_id
</span>=> <span>
$line
</span>) {
<span>
if
</span>(<span>
$line_id
</span><span><= </span><span>
$line_dat
<strong>a_star</strong>t</span>)
<span>
$part_lines
</span><span>[</span><span>
$line_id
</span><span>] = </span><span>
''
</span><span>;
</span>}
<span>
$part_lines
</span><span>= </span>implode ( <span>
''
</span>, <span>
$part_lines
</span>)<span>;
</span><span>
if
</span>(<span>
$encoding
</span><span>== </span><span>
'base64'
</span>)
<span>
$part_lines
</span><span>= </span>
base64_decode
( <span>
$part_lines
</span>)<span>;
</span><span>
elseif
</span>(<span>
$encoding
</span><span>== </span><span>
'quoted-printable'
</span>)
<span>
$part_lines
</span><span>= </span>imap_qprint ( <span>
$part_lines
</span>)<span>;
</span><span>
return
</span><span>
$part_lines
</span><span>;
</span>}
<span>
function
</span>read_filedata() {
<span>
$handle
</span><span>= </span>
fopen
( <span>
$this
</span><span>-></span>file, <span>
'r'
</span>)<span>;
</span><span>
$this
</span><span>-></span>filedata <span>= </span>
fread
( <span>
$handle
</span>,
filesize
( <span>
$this
</span><span>-></span>file ) )<span>;
</span>fclose ( <span>
$handle
</span>)<span>;
</span>}
<span>
function
</span>getrange(<span>&</span><span>
$subject
</span>, <span>
$Beginmark_str
</span><span>= </span><span>
'{'
</span>, <span>
$Endmark_str
</span><span>= </span><span>
'}'
</span>, <span>
$Start_pos
</span><span>= </span><span>0</span>) {
<span>
</span><span>
if
</span>(<span>
empty
</span>( <span>
$Beginmark_str
</span>))
<span>
$Beginmark_str
</span><span>= </span><span>
'{'
</span><span>;
</span><span>
$Beginmark_str_len
</span><span>= </span>
strlen
( <span>
$Beginmark_str
</span>)<span>;
</span><span>
if
</span>(<span>
empty
</span>( <span>
$Endmark_str
</span>))
<span>
$Endmark_str
</span><span>= </span><span>
'}'
</span><span>;
</span><span>
$Endmark_str_len
</span><span>= </span>
strlen
( <span>
$Endmark_str
</span>)<span>;
</span><span>
</span><span>
do
</span>{
<span>
</span><span>
if
</span>(<span>! </span>
is_int
( <span>
$Begin_firstOccurence_pos
</span>))
<span>
$Start_pos_cache
</span><span>= </span><span>
$Start_pos
</span><span>;
</span><span>
</span><span>
$Start_pos_cache
</span><span>= @</span>
strpos
( <span>
$subject
</span>, <span>
$Beginmark_str
</span>, <span>
$Start_pos_cache
</span>)<span>;
</span><span>
</span><span>
if
</span>(
is_int
( <span>
$Start_pos_cache
</span>)) {
<span>
</span><span>
$Start_pos_cache
</span><span>= </span>(<span>
$Start_pos_cache
</span><span>+ </span><span>
$Beginmark_str_len
</span>)<span>;
</span><span>
</span><span>
if
</span>(
is_int
( <span>
$Begin_firstOccurence_pos
</span>)) {
<span>
if
</span>(<span>
$Start_pos_cache
</span><span>< </span><span>
$range_end_pos
</span>)
<span>
$rangeClean
</span><span>= </span><span>0</span><span>;
</span><span>
elseif
</span>(<span>
$Start_pos_cache
</span><span>> </span><span>
$range_end_pos
</span>)
<span>
$rangeClean
</span><span>= </span><span>1</span><span>;
</span>}
<span>
</span><span>
if
</span>(<span>! </span>
is_int
( <span>
$Begin_firstOccurence_pos
</span>))
<span>
$Begin_firstOccurence_pos
</span><span>= </span><span>
$Start_pos_cache
</span><span>;
</span>} <span>
</span><span>
if
</span>(<span>! </span>
is_int
( <span>
$Start_pos_cache
</span>)) {
<span>
</span><span>
</span><span>
if
</span>(
is_int
( <span>
$Begin_firstOccurence_pos
</span>) <span>
and
</span>(<span>
$Start_pos_cache
</span><span>< </span><span>
$range_end_pos
</span>))
<span>
$rangeClean
</span><span>= </span><span>1</span><span>;
</span><span>
else
</span><span>
return
false</span><span>;
</span>}
<span>
if
</span>(
is_int
( <span>
$Begin_firstOccurence_pos
</span>) <span>
and
</span>(<span>
$rangeClean
</span><span>!= </span><span>1</span>)) {
<span>
if
</span>(<span>! </span>
is_int
( <span>
$End_pos_cache
</span>))
<span>
$End_sequel_pos
</span><span>= </span><span>
$Begin_firstOccurence_pos
</span><span>;
</span><span>
$End_pos_cache
</span><span>= </span>
strpos
( <span>
$subject
</span>, <span>
$Endmark_str
</span>, <span>
$End_sequel_pos
</span>)<span>;
</span><span>
</span><span>
if
</span>(
is_int
( <span>
$End_pos_cache
</span>) <span>
and
</span>(<span>
$rangeClean
</span><span>!= </span><span>1</span>)) {
<span>
$range_current_lenght
</span><span>= </span>(<span>
$End_pos_cache
</span><span>- </span><span>
$Begin_firstOccurence_pos
</span>)<span>;
</span><span>
$End_sequel_pos
</span><span>= </span>(<span>
$End_pos_cache
</span><span>+ </span><span>
$Endmark_str_len
</span>)<span>;
</span><span>
$range_end_pos
</span><span>= </span><span>
$End_pos_cache
</span><span>;
</span>}
<span>
</span><span>
if
</span>(<span>! </span>
is_int
( <span>
$End_pos_cache
</span>))
<span>
if
</span>(<span>
$End_pos_cache
</span><span>== </span><span>false</span>)
<span>
return
false</span><span>;
</span>}
} <span>
while
</span>( <span>
$rangeClean
</span><span>< </span><span>1 </span>)<span>;
</span><span>
if
</span>(
is_int
( <span>
$Begin_firstOccurence_pos
</span>) <span>
and
</span>
is_int
( <span>
$range_current_lenght
</span>))
<span>
$Range
</span><span>= </span>
substr
( <span>
$subject
</span>, <span>
$Begin_firstOccurence_pos
</span>, <span>
$range_current_lenght
</span>)<span>;
</span><span>
else
</span><span>
return
false</span><span>;
</span><span>
return
array
</span>(
<span>
'range'
</span>=> <span>
$Range
</span>,
<span>
'begin'
</span>=> <span>
$Begin_firstOccurence_pos
</span>,
<span>
'end'
</span>=> <span>
$End_sequel_pos
</span>)<span>;
</span>} <span>
</span>} <span>
</span><span>
</span></span>