2014-03-21 3 views
1

Я пытаюсь разобрать почтовый менеджер, но я не могу найти, как получить часть из заголовка, у которого есть символ новой строки после точки с запятой.php preg_match значение или точка с запятой до новой строки

Пример:

Content-Type: multipart/related; 
    type="multipart/alternative"; 
    boundary="----_=_NextPart_002_01CF36FC.6259F03C" 

Я разборе это с помощью следующих регулярных выражений в preg_match_all:

/(?P<keyname>.*):(\s*)?(?<value>(?:(?!;).)+)((\s*)?;([\s\\r\\n\\t]*)?(?<sub_value>.*)))?/i 

Но это не дает мне пограничную линию внутри sub_value. Я попытался также с

(?<sub_value>(.+|;[\s\\r\\n\\t]*)) 

вместо

(?<sub_value>.*) 

но это ничего не меняет.

.+|;[\s\\r\\n\\t]*<br> 

как и во всех символов, или точку с запятой с новой строки/вкладки после него

Заранее спасибо!

Edit: Когда я использую

(?<sub_value>([\w_.=\"\/\-;\s\\r\\n\\t]*)) 

Я получаю граничную часть тоже, но это становится все больше, чем это должно быть, и все символы включены, которые могут присутствовать в mailboundary? Кроме того, он ловит новую строку без точки с запятой.

+0

Как вы хотите массив ссылок выглядеть? Другими словами, что именно вы хотите захватить? –

+0

Собственно, Content-Type попадет в «keyname», а значение после: получит значение «value». Все остальные аргументы, которые находятся после точки с запятой в sub_value, которая будет проанализирована позже в коде. Но если есть другое ключевое слово или как вы можете его назвать, ему нужно попасть в другой подмассив (он будет иметь другой ключ в массиве результатов). Хорошая matcharray будет выглядеть так: [keyname] => Array [0] => Content-Type [value] => Array [0] => multipart/related [sub_value] => Array [0] = > type = "multipart/alternative"; \t border = "----_ = _ NextPart_002_01CF36FC.6259F03C" – Marbug

ответ

0

Попробуйте это:

$headers = <<<EOT 
Host: www.example.com 
Content-Length: 9000 
Content-Type: multipart/related; 
    type="multipart/alternative"; 
    boundary="----_=_NextPart_002_01CF36FC.6259F03C" 
X-Http: ok 
EOT; 

preg_match_all("/(?P<keyname>[a-zA-Z0-9-]+):(?P<value>.*?)[\n\r;]+(?P<sub_value>[\s\S]*?)(?=$|[a-zA-Z0-9-]+:)/", $headers, $match); 

Вы можете получить объяснение регулярных выражений из this link. Просто удалите (?:P<...>) из регулярного выражения, когда вы попытаетесь получить объяснение, используя the link.

+0

Спасибо за ответ! Регулярное выражение, которое вы дали, почти сработало, хотя мне нужно было немного его отредактировать, потому что я не смог получить «Content-Transfer-Encoding: quoted-printable», где «X-Http: ok» в вашем примере: /(? P [a-zA-Z0-9 -] +) :(?P (?:?).) +) ([? S \ n; r;] +)? (? P [ Z0-9 -] + :) / – Marbug

0

Согласно RFC1341 RFC1521 Я считаю, что это регулярное выражение содержит возможные граничные символы:

$regex = "/" 
     . "(?P<keyname>.*)" 
     . ":(\s*)?" 
     . "(?<value>(?:(?!;).)+)" 
     . "(" 
     . "(\s*)?;" 
     . "([\s\\r\\n\\t]*)?" 
     . "(?<sub_value>(['()+_,\-.:;?=\"\/\w\s\\r\\n\\t]*))" 
     . ")?" 
     . "/i"; 

EDIT обновленную ссылку RFC и регулярное выражение

Смежные вопросы