2013-03-04 37 views
-1

有!正則表達式解析郵件主題與多種編碼

我想匹配所有的內聯編碼在一個郵件主題和建立UTF8主題字符串。

一些例子:

[Listname | Topic123] =?utf-8?Q?encodedtext?= 
=?iso-8859-1?q?this=20is=20some=20text?= 
Klartext-Betreff 
[Listname | Topic123] =?utf-8?Q?encodedtext?= =?iso-8859-1?q?this=20is=20some=20text?= 
=?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?= 
    =?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?= 

我也得到了一個郵件有兩個不同的編碼(最後一行中的例子)。

電子郵件中,也可能是可能的,即當被攝體在多行分割,其中每行(除了第一個)與至少一個空白

所以我要尋找一個正則表達式開始,它解析:

部分+

其中部分是一個:

  • 文本與空間
  • = ???charset編碼編碼文本=

我認爲沃爾去是這樣的:?

ENC = (=\?)([A-Za-z0-9-]*)(\?)([A-Za-z0-9-]*)(?)([Any Character])(\?=) 
Part = any character that doesnt match to ENC or ENC 
+0

什麼語言或工具你有什麼嘗試? – squiguy 2013-03-04 04:26:04

+0

語言:PHP,我會使用preg_match_all。我還沒有嘗試過任何東西,因爲我不知道如何形成該正則表達式 – Tobi 2013-03-04 04:29:21

回答

0
function decode ($string, $source_enc, $dest_enc) 
{ 
    $parts = preg_split (
     '/=\?([^?]+)\?([^?]+)\?([^?]+)\?=/', 
     $string, 
     -1, PREG_SPLIT_DELIM_CAPTURE); 

    $result = ""; 

    for ($i = 0; $i < count ($parts); $i++) 
    { 
     $part = $parts [$i]; 

     if ($i % 4 == 0) 
      $result .= iconv ($source_enc, $dest_enc, $part); 
     else 
     { 
      $charset = $parts [$i++]; 
      $encoding = $parts [$i++]; 
      $text = $parts [$i]; 

      if ($encoding == 'Q' || $encoding == 'q') 
       $text = quoted_printable_decode ($text); 
      else if ($encoding == 'B' || $encoding == 'b') 
       $text = base64_decode ($text); 

      $result .= iconv ($charset, $dest_enc, $text); 
     } 
    } 

    return $result; 
} 

echo (decode ("=?utf-8?Q?encodedtext?= =?iso-8859-1?q?this=20is=20some=20text?= 
=?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?= 
    =?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?=", 
    "ISO-8859-1", "ISO-8859-1")); 

輸出對我來說是:

encodedtext this is some text If you can read this yo u understand the example. 
+0

我在哪裏可以得到sorce編碼 - 是「Content-Type:... charset =」「編碼嗎?我也有一個明確的[列表]作爲第一部分,這是不是像其他部分編碼? – Tobi 2013-03-04 05:18:55

+0

@ user1997286根據這個維基百科頁面:http://en.wikipedia.org/wiki/MIME#Encoded --Word everything outside =?...?=應該只使用ASCII字符,所以源編碼可能總是'ISO-8859-1' – 2013-03-04 06:11:23

+0

如果設置了Transfer-Encoding:... charset =「x 「Header;然後將X作爲主題或ISO-8859-1的字符集?其他問題:如果我在我的代碼中使用該部分,您是否介意將您的計算器帳戶與謝謝關聯起來? – Tobi 2013-03-04 15:01:32