【问题标题】:Email read in PHP用 PHP 读取电子邮件
【发布时间】:2013-06-22 05:38:36
【问题描述】:

我需要从这个email读取字段

MOVE INFORMATION

Pickup Address: 34 Marigold Ln, Marlboro, NJ 07746

Delivery Address: 180 Prospect Park W, Apt 5, Brooklyn, NY 11215

Primary service dates:
Pack Date: N/A
Move Date: 6/6/2013

Other service dates:
Pack Date 2: N/A
Move Date2: N/A
Other Date: N/A

我正在遵循的过程是:

  1. 通过 IMAP 连接
  2. 得到 nessage 身体

现在我想读取指定的数据并需要将其转换为数组,如:

array( ' Pickup Address'=>'34 Marigold Ln, Marlboro, NJ 07746', 
       'Delivery Address'=>'180 Prospect Park W, Apt 5, Brooklyn, NY 11215'...)

我试过preg_match('/(?P<Pickup Address>\w+): (?P<Delivery Address>\d+)/', $body, $matches)

但那有一些问题:

  1. “取货地址”中不接受空格
  2. 它提供Array ( [0] => Address: 34 [PickupAddress] => Address [1] => Address [DeliveryAddress] => 34 [2] => 34 ) 格式的数组。

基本上我需要将这些字段保存在数据库中,我不能在这里使用附件。如果您有任何其他解决方案或任何使其工作的方法,请告诉我

【问题讨论】:

  • 每次的顺序和格式都一样吗?是指先取货地址,然后是送货地址等等?
  • 是的!字段名称将保持不变,它们的值会有所不同

标签: php regex database email


【解决方案1】:

您似乎已经选择了一个解决方案,但很难使其适合该问题。是的,你可以使用正则表达式——但你必须比你已经拥有的更好地定义问题。如果一行包含多个 ':' 怎么办?空行怎么办?如果一个数据项跨越多行(这可能取决于电子邮件的编码方式)怎么办?

虽然您可以使用 YAML parser,但对于简单的布局来说,这可能有点过头了:

$data=array();
while ($line=fgets($file_handle)) {
     $key=trim(substr($line, 0, strpos($line, ':')));
     $value=trim(substr($line, strpos($line, ':')+1));
     if ($key && $value) $data[$key]=$value; 
}

【讨论】:

  • 我喜欢这个,人们倾向于认为正则表达式是解决所有问题的方法。
【解决方案2】:

你可以使用这样的代码:

preg_match_all("/(Pickup Address|Delivery Address): *(.*)/", $email, $match);
$result = array();
foreach($match[1] as $i => $key) {
    $result[$key] = $match[2][$i];
}
print_r($result);

如果您想要更多字段,只需将它们添加到正则表达式。

【讨论】:

    【解决方案3】:

    这样的?

    $string = 'MOVE INFORMATION
    
    Pickup Address: 34 Marigold Ln, Marlboro, NJ 07746
    
    Delivery Address: 180 Prospect Park W, Apt 5, Brooklyn, NY 11215
    
    Primary service dates:
    Pack Date: N/A
    Move Date: 6/6/2013
    
    Other service dates:
    Pack Date 2: N/A
    Move Date2: N/A
    Other Date: N/A';
    
    preg_match_all('#(.*?):(.*)#m', $string, $m);
    if(isset($m[1], $m[2])){
        $array = array_combine($m[1], $m[2]);
        print_r($array);
    }
    

    输出:

    Array
    (
        [Pickup Address] =>  34 Marigold Ln, Marlboro, NJ 07746
        [Delivery Address] =>  180 Prospect Park W, Apt 5, Brooklyn, NY 11215
        [Primary service dates] => 
        [Pack Date] =>  N/A
        [Move Date] =>  6/6/2013
        [Other service dates] => 
        [Pack Date 2] =>  N/A
        [Move Date2] =>  N/A
        [Other Date] =>  N/A
    )
    

    【讨论】:

    • 如果正确的值也有“:”字符怎么办?
    • 点赞地址:34 Marigold Ln, Marlboro:NJ 07746
    • 它有问题,如果正确的值有换行符,它只读取第一行。
    • @IrfanDANISH 是的,当然。否则你将如何区分左右或者它是否是你想要输入的有效字符串?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 2012-03-13
    • 2019-09-02
    相关资源
    最近更新 更多