【问题标题】:Splitting mail headers using preg_match使用 preg_match 拆分邮件标头
【发布时间】:2012-05-22 17:00:42
【问题描述】:

我必须通过电子邮件发送标题,并且我想提取不同的数据:发件人、主题、日期等。

$mail1 = 'From: <encuestas@despegar.com>
To: 4fb661d55e409@ventas.ciudades.com
Subject: Califique nuestro servicio
Date: Sat, 19 May 2012 10:39:04 -0400
Message-ID: <3b6401cd35cd$23d08b90$0c01010a@despexds.net>
MIME-Version: 1.0';

$mail2 = 'Date: Fri, 21 Oct 2011 13:42:46 +0000 (GMT)
From: "Decolar.com" <non-reply@despegar.com>
To: 4ea15be894aca@ventas.ciudades.com
Message-ID: <2009175400.15674.1319204566275.JavaMail.root@uns02>
Subject: =?UTF-8?Q?Decolar.com_-_Solicita=C3=A7=C3=A3o_?=
 =?UTF-8?Q?de_compra_-_N=C3=BAmero:10603789?=
MIME-Version: 1.0';


preg_match("/Subject: (.)*(Date|Message-ID|From|To|MIME-Version):/s",$mail1,$m);        
print_r($m);       

我正在使用上面的代码来获取主题,但结果不是预期的。

对于mail1,我得到:

Array
(
    [0] => Subject: Califique nuestro servicio
Date: Sat, 19 May 2012 10:39:04 -0400
Message-ID: <3b6401cd35cd$23d08b90$0c01010a@despexds.net>
MIME-Version:
    [1] => 

    [2] => MIME-Version
)

对于mail2,我得到:

Array
(
    [0] => Subject: =?UTF-8?Q?Decolar.com_-_Solicita=C3=A7=C3=A3o_?=
 =?UTF-8?Q?de_compra_-_N=C3=BAmero:10603789?=
MIME-Version:
    [1] => 

    [2] => MIME-Version
)

两种情况,主题都是空的。

【问题讨论】:

    标签: php pcre


    【解决方案1】:

    我可能会这样做:

    function normalize_array($arr) {
        for ($res = array(), $i = 0; $i < count($arr); $i+=2) {
            $key = strtr($arr[$i],array(': '=>'','-'=>'_'));
            $res[$key] = $arr[$i+1];
        }
        return $res;
    }
    
    $mailData = normalize_array(preg_split('~([\w-]+: )~',$mail1,-1,PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY));
    print_r($mailData);
    

    将返回:

    大批 ( [来自] => [致] => 4fb661d55e409@ventas.ciudades.com [主题] => Califique nuestro servicio [日期] => 2012 年 5 月 19 日星期六 10:39:04 -0400 [Message_ID] => [MIME_Version] => 1.0 )

    【讨论】:

    • 这不是我想要的,但它甚至是一个更好的解决方案!非常感谢inhan
    • 不客气。您可能想通过在替换数组中添加 '\r\n'=&gt;'','\n'=&gt;'','\r'=&gt;'' 来消除主题字段中的换行符(因为它们不存在)。
    • 是的,我不确定它们是否存在,我认为它们只是因为我保存电子邮件时的包装而存在。无论如何,这是一个很好的清洁工作。
    【解决方案2】:

    正则表达式模式应该是:

    /Subject: (.*)\b/
    

    【讨论】:

    • 实际上我想完全匹配文本“日期”,“消息”,..,而不是任何人。无论如何感谢您的帮助,我学到了一些新东西;)
    猜你喜欢
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 2012-05-10
    • 1970-01-01
    相关资源
    最近更新 更多