0

本文が次のようになっている場合、転送されたメールからのメールとccを取得しようとしています。

$body = '-------
Begin forwarded message:


From: Sarah Johnson <blabla@gmail.com>

Subject: email subject

Date: February 22, 2013 3:48:12 AM

To: Email Recipient <thatwouldbe@yayyy.com>

Cc: Ralph Johnson <johnson@gmail.com>


Hi,


hello, thank you and goodbye!

 blabla@gmail.com'

今、私が次のことをするとき:

$body = strtolower($body);
$pattern = '#from: \D*\S([\w-\.]+)@((?:[\w]+\.)+)([a-zA-Z]{2,4})\S#';
if (preg_match($pattern, $body, $arr_matches)) {
     echo htmlentities($arr_matches[0]);
     die();
}

私は正しく得ます:

from: sarah johnson <blabla@gmail.com>

さて、なぜccが機能しないのですか?私は非常によく似た何かをしますが、ccに変更するだけです:

$body = strtolower($body);
$pattern = '#cc: \D*\S([\w-\.]+)@((?:[\w]+\.)+)([a-zA-Z]{2,4})\S#';
if (preg_match($pattern, $body, $arr_matches)) {
     echo htmlentities($arr_matches[0]);
     die();
}

そして私は得る:

cc: ralph johnson <johnson@gmail.com> hi, hello, thank you and goodbye! blabla@gmail.com

元の本文フッターからメールを削除すると(blabla@gmail.comを削除)、正しく次のようになります。

cc: ralph johnson <johnson@gmail.com>

そのメールが正規表現に影響を与えているようです。しかし、どのように、そしてなぜそれはfromでそれに影響を与えないのですか?どうすればこれを修正できますか?

4

2 に答える 2

3

問題は、\D*一致が多すぎることです。つまり、改行文字も一致しています。ここではもっと制限します。なぜ\D(数字ではなく)使用するのですか?

例えば[^@]*それは働いています

cc: [^@]*\S([\w-\.]+)@((?:[\w]+\.)+)([a-zA-Z]{2,4})\S

ここRegexrでそれを参照してください。

このようにして、この最初の部分が電子メールアドレスを超えて一致していないことを確認します。

これ\Dも理由であり、最初の「From」の場合に機能します。「日付」行に数字があるため、この行と一致しません。

于 2013-02-26T18:58:47.513 に答える
1

このようにしてみてください

$body = '-------
Begin forwarded message:


From: Sarah Johnson <blabla@gmail.com>

Subject: email subject

Date: February 22, 2013 3:48:12 AM

To: Email Recipient <thatwouldbe@yayyy.com>

Cc: Ralph Johnson <johnson@gmail.com>


Hi,


hello, thank you and goodbye!

 blabla@gmail.com';

$pattern = '#(?:from|Cc):\s+[^<>]+<([^@]+@[^>\s]+)>#is';
preg_match_all($pattern, $body, $arr_matches);
echo '<pre>' . htmlspecialchars(print_r($arr_matches, 1)) . '</pre>';

出力

Array
(
    [0] => Array
        (
            [0] => From: Sarah Johnson <blabla@gmail.com>
            [1] => Cc: Ralph Johnson <johnson@gmail.com>
        )

    [1] => Array
        (
            [0] => blabla@gmail.com
            [1] => johnson@gmail.com
        )

)

$arr_matches[1][0] - "From" email
$arr_matches[1][1] - "Cc" email
于 2013-02-26T19:21:25.187 に答える