提醒一下,如果您的標頭字串有任何前導換行符號,此函式將會拒絕它並返回一個空陣列。如果您的輸入可能包含前導換行符號,請使用 ltrim() 清理它。
尾端的空行會被容許/忽略。
我剛剛注意到的其他怪癖
1. *第一*行中的前導空白字元(" " 或 "\t")將會包含在返回陣列中標頭的鍵名中。 ltrim() 也能防止這種情況。
2. 任何後續標頭(在鍵名之前)中的前導空白字元將會導致該行被附加到前一個標頭的值中,就好像它是該標頭的延續一樣。
(PHP 5, PHP 7, PHP 8)
iconv_mime_decode_headers — 一次解碼多個 MIME
標頭欄位
一次解碼多個 MIME
標頭欄位。
headers
編碼後的標頭,以字串形式呈現。
模式 (mode)
mode
參數決定了 iconv_mime_decode_headers() 函式在遇到格式錯誤的 MIME
標頭欄位時的行為。您可以指定以下位元遮罩的任意組合。
值 | 常數 | 說明 |
---|---|---|
1 | ICONV_MIME_DECODE_STRICT | 如果設定此選項,則給定的標頭將會完全依照 » RFC2047 中定義的標準進行解碼。此選項預設為停用,因為有許多損壞的郵件使用者代理程式不遵循規範,並且不會產生正確的 MIME 標頭。 |
2 | ICONV_MIME_DECODE_CONTINUE_ON_ERROR | 如果設定此選項,iconv_mime_decode_headers() 將會嘗試忽略任何語法錯誤,並繼續處理給定的標頭。 |
編碼 (encoding)
選用的 encoding
參數指定用於表示結果的字元集。如果省略或設為 null
,則會使用 iconv.internal_encoding。
成功時,會傳回一個關聯式陣列,其中包含由 headers
指定的整組 MIME
標頭欄位;如果解碼過程中發生錯誤,則傳回 false
。
回傳值的每個鍵代表一個欄位名稱,而對應的元素則代表欄位值。如果存在多個相同名稱的欄位,iconv_mime_decode_headers() 會自動將它們按出現順序合併到一個數字索引的陣列中。請注意,標頭名稱*區分大小寫*。
版本 | 說明 |
---|---|
8.0.0 |
encoding 現在可以為 null。 |
範例 #1 iconv_mime_decode_headers() 範例
<?php
$headers_string = <<<EOF
Subject: =?UTF-8?B?UHLDvGZ1bmcgUHLDvGZ1bmc=?=
To: example@example.com
Date: Thu, 1 Jan 1970 00:00:00 +0000
Message-Id: <example@example.com>
Received: from localhost (localhost [127.0.0.1]) by localhost
with SMTP id example for <example@example.com>;
Thu, 1 Jan 1970 00:00:00 +0000 (UTC)
(envelope-from example-return-0000-example=example.com@example.com)
Received: (qmail 0 invoked by uid 65534); 1 Thu 2003 00:00:00 +0000
EOF;
$headers = iconv_mime_decode_headers($headers_string, 0, "ISO-8859-1");
print_r($headers);
?>
以上範例將會輸出:
Array ( [Subject] => Prüfung Prüfung [To] => example@example.com [Date] => Thu, 1 Jan 1970 00:00:00 +0000 [Message-Id] => <example@example.com> [Received] => Array ( [0] => from localhost (localhost [127.0.0.1]) by localhost with SMTP id example for <example@example.com>; Thu, 1 Jan 1970 00:00:00 +0000 (UTC) (envelope-from example-return-0000-example=example.com@example.com) [1] => (qmail 0 invoked by uid 65534); 1 Thu 2003 00:00:00 +0000 ) )
提醒一下,如果您的標頭字串有任何前導換行符號,此函式將會拒絕它並返回一個空陣列。如果您的輸入可能包含前導換行符號,請使用 ltrim() 清理它。
尾端的空行會被容許/忽略。
我剛剛注意到的其他怪癖
1. *第一*行中的前導空白字元(" " 或 "\t")將會包含在返回陣列中標頭的鍵名中。 ltrim() 也能防止這種情況。
2. 任何後續標頭(在鍵名之前)中的前導空白字元將會導致該行被附加到前一個標頭的值中,就好像它是該標頭的延續一樣。
如果您需要小寫的標頭名稱(根據我讀到的文件,大小寫並不能保證),請嘗試以下程式碼:
<?php
$headers_string = <<<EOF
Subject: =?UTF-8?B?UHLDvGZ1bmcgUHLDvGZ1bmc=?=
To: example@example.com
Date: Thu, 1 Jan 1970 00:00:00 +0000
Message-Id: <example@example.com>
Received: from localhost (localhost [127.0.0.1]) by localhost
with SMTP id example for <example@example.com>;
Thu, 1 Jan 1970 00:00:00 +0000 (UTC)
(envelope-from example-return-0000-example=example.com@example.com)
Received: (qmail 0 invoked by uid 65534); 1 Thu 2003 00:00:00 +0000
EOF;
$headers = iconv_mime_decode_headers($headers_string, 0, "ISO-8859-1");
$headers = array_combine(array_map("strtolower", array_keys($headers)), array_values($headers));
print_r($headers);
?>