Что нового

Нужна регулярка для Content-Type: text/plain в письме

timsky

Осваивающий
Сообщения
93
Репутация
28
Уже часа 3 голову ломаю, но никак не могу слепить универсальную регулярку для выдергивания Content-Type: text/plain и Content-Type: text/html в письме. Вот пример тела письма:
--------------Boundary-00=_Q4V2Q7B2QL8000000000
Content-Type: Multipart/Alternative;
boundary="------------Boundary-00=_Q4V2LHG2QL8000000000"


--------------Boundary-00=_Q4V2LHG2QL8000000000
Content-Type: Text/Plain;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

Здесь, например, какой-нибудь текст!
Здесь, например, какой-нибудь текст!
Здесь, например, какой-нибудь текст!

--------------Boundary-00=_Q4V2LHG2QL8000000000
Content-Type: Text/HTML;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<HTML><HEAD>
<META content=3D"text/html; charset=3Diso-8859-1" http-equiv=3DContent-Typ=
e>
<META name=3DGENERATOR content=3D"IncrediMail 1.0">
<STYLE>v\:* {
BEHAVIOR: url (#default#vml)
}
</STYLE>
<style>v\:* {
BEHAVIOR: url (#default#vml)
}
</style><BASE href=3D"file://C:\"></HEAD> <BODY style=3D"MARGIN: 10px 10p=
x 10px 47px; BACKGROUND-REPEAT: repeat; FONT-FAMILY: Arial; BACKGROUND-POS=
ITION: left top; FONT-SIZE: 10pt" background=3Dcid:1A691D9A-2A07-410B-A9FB=
-5027D63B2D2D scroll=3Dyes bgColor=3D#edf1f0 SIGCOLOR=3D"11031552" INCREDI=
FIXEDFORIMOL=3D"true"> <TABLE id=3DINCREDIMAINTABLE border=3D0 cellSpacin=
g=3D0 cellPadding=3D2 width=3D"100%"> <TBODY> <TR> <TD style=3D"DIRECTI=
ON: ltr; FONT-SIZE: 10pt" dir=3Dltr id=3DINCREDITEXTREGION vAlign=3Dtop wi=
dth=3D"100%"> <DIV>
Здесь, например, какой-нибудь текст!

Здесь, например, какой-нибудь текст!

Здесь, например, какой-нибудь текст!

</DIV></TD></TR> <TR> <TD id=3DINCREDIFOOTER width=3D"100%"> <TABLE ce=
llSpacing=3D0 cellPadding=3D0 width=3D"100%"> <TBODY> <TR> <TD width=3D=
"100%"></TD> <TD id=3DINCREDISOUND vAlign=3Dbottom align=3Dmiddle></TD>=
<TD id=3DINCREDIANIM vAlign=3Dbottom align=3Dmiddle></TD></TR></TBODY></=
TABLE></TD></TR></TBODY></TABLE><SPAN id=3DIncrediStamp><A href=3D"http://=
www.incredimail.com/?id=3D606430&amp;rui=3D88054161"><SPAN name=3D"imgCach=
e" border=3D"0"><IMG border=3D0 alt=3D"FREE Animations for your email - by=
IncrediMail! Click Here!" src=3D"cid:97504DF8-22EE-434A-A144-9EA9FAB3F4FF=
"></SPAN></A></SPAN></BODY></HTML>

--------------Boundary-00=_Q4V2LHG2QL8000000000--

--------------Boundary-00=_Q4V2Q7B2QL8000000000
Content-Type: image/jpeg; name="23.jpg"
Content-Transfer-Encoding: base64
Content-ID: <1A691D9A-2A07-410B-A9FB-5027D63B2D2D>

/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAJgAA/+4AIUFkb2JlAGTAAAAAAQMA
EOS/pQ5lDkjyX8Q/qHL8Q5L+lf0/q7vUL3Q5L+BeyK/i/gXd6he6HJfwL2RX8X8C7uX4vdDkv4F7
fq7l/F/AhyXb/EOZXv8AaHJf:rofl:vqF7/aHJdv8Q5le/2hyX8Xb6he/wBocl2/:rofl:mV7/aHJf:rofl:vqF7
/aHJdv8AEOZXv9ocl/F2+oXv9ocl2/:rofl:+ocyhyR5D6X8Q/qHL8Q5L+lDmUOSPJf:rofl:+ocv:rofl:kv6UO
ZQ5I8l/EP6hy/EOS/pX9P6u71C90OS/gXsiv4v4F3eoXuhyX8C9kV/F/Au7l+L3Q5L+Be36u5fxf
wIcl2/:rofl:mV7/AGhyX8Xb6he/2hyXb/EOZXv9ocl/F2+oXv8AaHJdv8Q5le/2hyX8X8/F/9k=

--------------Boundary-00=_Q4V2Q7B2QL8000000000
Content-Type: image/gif; name="stampa_girl_line_en.gif"
Content-Transfer-Encoding: base64
Content-ID: <97504DF8-22EE-434A-A144-9EA9FAB3F4FF>

R0lGODlh3AGMANUAAPb6/JCLqvaVHrkZTQEAAPI6X9iIT7JpYPmxmXWIxIUROax2i85OcmYPMcjV
5tnZ2bjI3am30NB5FWt7trNmCyxQggAA/1lll9eQfFBcj5ZWYv3Os5Sm6HVzm4aY2AJFd+qhhvS6
o2FwqPe3TQs3W8Kzt9rk79milJCozKiirMJ9cMGUm+93jc7GyKG0929FRHhsdQAAAAAAAAAAAAAA
G8BIC8uxXM7mfM7oHMiQbDlAC7GjHA+AnM7yPM/0DMXrXAX2m8/6vM/83M/+/M8AHdACPdAEXdAG
fdAIndAKvdD9PM71/NAQHdH3zKviEM8RfdEYrc6/TNH1YNEZ/dEgrb0TzdHPEFEhfdIoDQA1SdL0
EAFVQ6UwHdMyPdM0baVkEAQAOw==

--------------Boundary-00=_Q4V2Q7B2QL8000000000--
.
Мне нужно это:

Здесь, например, какой-нибудь текст!
Здесь, например, какой-нибудь текст!
Здесь, например, какой-нибудь текст!
Ну или вместе с тегами Content-Type: / charset / Content-Transfer-Encoding и прочими, относящимися к тексту письма.
То же самое, соответственно, должно сработать и для Content-Type: text/html.

Нашел вот такой скрипт Tipulatiod и CreatoR, но он работает только в половине реальных случаев :( Плюс к тому же он возвращает постоянно разноразмерный массив, а разбирать, как он фунциклирует уже сил нет. Нечто замудренное...

И вообще каким макаром указать RegExp не глотать все подряд, а остановиться на первом совпадении?
Т.е. я пробовал вот такую регулярку: (?is)Content-Type:\s+text/plain(.*)Content-Type:.* и многие прочие варианты с greedy/не-greedy, lookbehind ит.д..., но все равно PCRE не обращает внимания на то, что мне нужен контент до следующего Content-Type:

Вобщем, я в тупике.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 402
(?si).*Content-Type: text/(?:blum:lain|html);.*Content-Transfer(?:[^(\r\n){2}]*)[\r\n]+(.*?)[\r\n]+-+Boundary.*
 
Автор
timsky

timsky

Осваивающий
Сообщения
93
Репутация
28
CreatoR [?]
(?si).*Content-Type: text/(?:blum:lain|html);.*Content-Transfer(?:[^(\r\n){2}]*)[\r\n]+(.*?)[\r\n]+-+Boundary.*
Эта регулярка дергает не то:
Content-ID: <97504DF8-22EE-434A-A144-9EA9FAB3F4FF>

R0lGODlh3AGMANUAAPb6/JCLqvaVHrkZTQEAAPI6X9iIT7JpYPmxmXWIxIUROax2i85OcmYPMcjV
5tnZ2bjI3am30NB5FWt7trNmCyxQggAA/1lll9eQfFBcj5ZWYv3Os5Sm6HVzm4aY2AJFd+qhhvS6
o2FwqPe3TQs3W8Kzt9rk79milJCozKiirMJ9cMGUm+93jc7GyKG0929FRHhsdQAAAAAAAAAAAAAA
G8BIC8uxXM7mfM7oHMiQbDlAC7GjHA+AnM7yPM/0DMXrXAX2m8/6vM/83M/+/M8AHdACPdAEXdAG
fdAIndAKvdD9PM71/NAQHdH3zKviEM8RfdEYrc6/TNH1YNEZ/dEgrb0TzdHPEFEhfdIoDQA1SdL0
EAFVQ6UwHdMyPdM0baVkEAQAOw==

Чет я поковырял твой вариант и тоже ничего не получается :(
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 402
Ok, это я поспешил, проверял на небольшой части приведённого кода.
Вот так вроде совпадает:

Код:
$vTest = ClipGet() ;Я скопировал в буфер код из первого сообщения

$sRet = StringRegExpReplace($vTest, '(?si).*?-+Boundary.*?[\r\n]+Content-Type: text/(?:plain|html);[\r\n]+.*?[\r\n]+Content-Transfer.*?[\r\n]+([^(-+Boundary)]*?)[\r\n]+-+Boundary.*', '\1')

ConsoleWrite($sRet & @LF)
 
Автор
timsky

timsky

Осваивающий
Сообщения
93
Репутация
28
CreatoR [?]
$vTest = ClipGet() ;Я скопировал в буфер код из первого сообщения
Я тоже так часто проверяю ;D

Спасибо за регулярку, работает! Но на конкренто этом примере :(
Я, вдохновленный ею, уже слепил чуток другую для вот такого, наиболее подходящего примера:
Content-Type: text/plain;
charset=ISO-8859-1

Здесь нужный ТЕКСТ1
Здесь нужный ТЕКСТ2
Здесь нужный ТЕКСТ3

--0016e64b1de82dc46b047dfa858e

Content-Type: text/html;
charset=ISO-8859-1
<HTML><BODY>
<div>Здесь нужный ТЕКСТ1</div>
<div>Здесь нужный ТЕКСТ2</div>
<div>Здесь нужный ТЕКСТ3</div>
</BODY></HTML>

--0016e64b1de82dc46b047dfa858e--

Content-Type: image/gif;
Content-Transfer-Encoding: base64

А здесь идет мусор (КАРТИНКА)
А здесь идет мусор (КАРТИНКА)
А здесь идет мусор (КАРТИНКА)

--0016e64b1de82dc46b047dfa858e--

Content-Type: application/octet-stream;
Content-Transfer-Encoding: base64

А здесь идет мусор (APPLICATION)
А здесь идет мусор (APPLICATION)
А здесь идет мусор (APPLICATION)


--0016e64b1de82dc46b047dfa858e--

А здесь идет мусор (КАРТИНКА2)
А здесь идет мусор (КАРТИНКА2)
А здесь идет мусор (КАРТИНКА2)

--0016e64b1de82dc46b047dfa858e--

Content-Type: application/octet-stream;
Content-Transfer-Encoding: base64

А здесь идет мусор (APPLICATION2)
А здесь идет мусор (APPLICATION2)
А здесь идет мусор (APPLICATION2)


--0016e64b1de82dc46b047dfa858e--

Код:
$sRet = StringRegExpReplace($vTest, '(?is)(Content-Type:\s+(multipart|message|application|image|audio|video)+.*)', '')


Начал тестить, вроде все ОК, но для случаев, когда заменяемый блок также есть сверху эта регулярка не подходит тоже:
------=_NextPart_000_0187_01CA9E7B.32828120
Content-Type: multipart/alternative;
boundary="----=_NextPart_001_0188_01CA9E7B.32828120"


Content-Type: text/plain;
charset=ISO-8859-1

Здесь нужный ТЕКСТ1
Здесь нужный ТЕКСТ2
Здесь нужный ТЕКСТ3

--0016e64b1de82dc46b047dfa858e

Content-Type: text/html;
charset=ISO-8859-1
<HTML><BODY>
<div>Здесь нужный ТЕКСТ1</div>
<div>Здесь нужный ТЕКСТ2</div>
<div>Здесь нужный ТЕКСТ3</div>
</BODY></HTML>

--0016e64b1de82dc46b047dfa858e--

Content-Type: image/gif;
Content-Transfer-Encoding: base64

А здесь идет мусор (КАРТИНКА)
А здесь идет мусор (КАРТИНКА)
А здесь идет мусор (КАРТИНКА)

--0016e64b1de82dc46b047dfa858e--

Content-Type: application/octet-stream;
Content-Transfer-Encoding: base64

А здесь идет мусор (APPLICATION)
А здесь идет мусор (APPLICATION)
А здесь идет мусор (APPLICATION)


--0016e64b1de82dc46b047dfa858e--

А здесь идет мусор (КАРТИНКА2)
А здесь идет мусор (КАРТИНКА2)
А здесь идет мусор (КАРТИНКА2)

--0016e64b1de82dc46b047dfa858e--

Content-Type: application/octet-stream;
Content-Transfer-Encoding: base64

А здесь идет мусор (APPLICATION2)
А здесь идет мусор (APPLICATION2)
А здесь идет мусор (APPLICATION2)


--0016e64b1de82dc46b047dfa858e--

Вобщем, я опять в тупике :( Пока ковыряю, если получится - отпишу здесь, но у меня слишком мало опыта в регулярках.
Уже думаю тупо построчно парсить текст что ли...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 402
'(?si).*?Content-Type: text/(?:blum:lain|html);[\r\n]+(?:[^\r\n]*)[\r\n]+(.*?)[\r\n]+--00.*'
тут естественно нужно заменять на \1.

Если у первого поиска .*? убрать знак вопроса, то будет выдавать второе совпадение, там где нужный текст обрамлён html тегами.
 
Автор
timsky

timsky

Осваивающий
Сообщения
93
Репутация
28
Хехе, спасибо огромное!
А то я уже ручной метод соорудил :smile:
 

Latoid

Знающий
Сообщения
95
Репутация
11
Я написал другой парсер электронной почты, он выдергивает текст письма, декодирует текст в читаемый вид, сохраняет его в текстовый файл; рядом кладет аттачи.
Он не универсальный к сожалению (не хватило способностей написать), например не обрабатывает ситуацию "письмо в письме" (по-моему это называется инкапсуляция), но корректно работает, пожалуй, в 95% случаев обычных писем.
Нужен?
 
Автор
timsky

timsky

Осваивающий
Сообщения
93
Репутация
28
Latoid
Это не тот, что я в первом посте упомянул?
А вообще, конечно кидай. Мне не нужно уже (пока?), но уверен, кому-нибудь пригодится.
 

Latoid

Знающий
Сообщения
95
Репутация
11
timsky сказал(а):
Latoid
Это не тот, что я в первом посте упомянул?
А вообще, конечно кидай. Мне не нужно уже (пока?), но уверен, кому-нибудь пригодится.
Не то. Получше
 
Верх