PHP Conference Japan 2024

iconv_mime_decode_headers

(PHP 5, PHP 7, PHP 8)

iconv_mime_decode_headers一次解碼多個 MIME 標頭欄位

說明

iconv_mime_decode_headers(字串 $headers, 整數 $mode = 0, ?字串 $encoding = null): 陣列|false

一次解碼多個 MIME 標頭欄位。

參數

headers

編碼後的標頭,以字串形式呈現。

模式 (mode)

mode 參數決定了 iconv_mime_decode_headers() 函式在遇到格式錯誤的 MIME 標頭欄位時的行為。您可以指定以下位元遮罩的任意組合。

iconv_mime_decode_headers() 可接受的位元遮罩
常數 說明
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
        )

)

參見

新增筆記

使用者貢獻的筆記 2 則筆記

0
phpmanual at NOSPAM dot headbank dot co dot uk
5 天前
提醒一下,如果您的標頭字串有任何前導換行符號,此函式將會拒絕它並返回一個空陣列。如果您的輸入可能包含前導換行符號,請使用 ltrim() 清理它。

尾端的空行會被容許/忽略。

我剛剛注意到的其他怪癖

1. *第一*行中的前導空白字元(" " 或 "\t")將會包含在返回陣列中標頭的鍵名中。 ltrim() 也能防止這種情況。

2. 任何後續標頭(在鍵名之前)中的前導空白字元將會導致該行被附加到前一個標頭的值中,就好像它是該標頭的延續一樣。
0
TheConstructor
14 年前
如果您需要小寫的標頭名稱(根據我讀到的文件,大小寫並不能保證),請嘗試以下程式碼:

<?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);
?>
To Top