4

これからフィールドを読み取る必要があります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. メッセージ本文を取得する

指定されたデータを読み取りたいので、次のような配列に変換する必要があります。

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 )ます。

基本的に、これらのフィールドをデータベースに保存する必要があり、ここでは添付ファイルを使用できません。他の解決策や、うまくいく方法があれば教えてください

4

3 に答える 3

5

このようなもの ?

$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
)
于 2013-06-25T12:21:25.777 に答える
2

あなたは解決策を選択したようですが、それを問題に適合させるのに苦労しています。はい、正規表現を使用できますが、問題をより適切に定義する必要があります。行に複数の「:」が含まれている場合はどうなりますか? 空白行はどうですか?データ項目が複数の行にまたがる場合 (電子メールのエンコード方法によってはそうなる可能性があります)?

YAML パーサーを使用することもできますが、単純なレイアウトにはおそらくやり過ぎです。

$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; 
}
于 2013-06-25T12:45:30.167 に答える
0

次のようなコードを使用できます。

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);

さらにフィールドが必要な場合は、それらを正規表現に追加するだけです。

于 2013-06-25T12:25:12.287 に答える