0

メール本文のインライン返信/転送の開始を識別するパターンを理解するのに少し苦労しています。「転送メッセージの開始」のような単純なもので始まる簡単なものがいくつかありますが、返信はもう少し複雑です:

On 12-06-13 10:56 AM, "John Doe" <john.doe@some.tld> wrote:

明らかに、定数は「On」と「wrote:」になります。最初の一致のみを見つけて、それ以降のすべてを display:none が適用された div でラップするか、substr($body,0, POSITION_OF_MATCH) を使用して削除できるようにしたいと考えています。

私が抱えている問題の 1 つは、最初の発生をキャッチしていないことです。2 つ目は、貪欲を適切に機能させることができないことです。

これまでの私の進捗状況 (少なくとも部分的に機能するバージョンに戻った) は次のとおりです。

preg_match("/On [^>]* wrote:/i",$content,$matches,PREG_OFFSET_CAPTURE);

どんな助けでも大歓迎です!

4

4 に答える 4

1

他の回答には感謝していますが、私が扱っていた応答文字列の多くの可能なバリエーションを実際に考慮したものはありませんでした. ただし、全員の努力に対して +1 を付けました。

オンとオフをいじって一日を過ごした後、最もうまく機能しているように見える最終的な解決策は次のとおりです。

/On (Mon|Tue|Wed|Thu|Fri|Sat|Sun|[[:digit:]]{1,2})(.*?) wrote:/i

それが始まるオプションリストは、「On Tue ...」または「On 23 ...」または「On 1 ...」などで始まるさまざまな返信タイプをカバーしています。 about はランダムな "on" 文字列からあまり取り入れていませんでしたが、(.*?) は名前/メール部分の残りの部分を処理し、最後に "wrote:" で終了します。

于 2012-11-07T14:41:31.837 に答える
1

私は提案します

$email = preg_match('/^On [^"]*"[^"]*" <([^>]*)> wrote:$/', $str, $re) ? $re[1] : '';

このデモを参照してください。

于 2012-11-06T19:32:07.010 に答える
1

クロージングと一致する可能性がないため、現在のバージョンがどのように機能するのだろうか>。しかし、次のようなことができます。

$content = preg_replace('/(On [^>]*> wrote:).*$/s', '$1', $content);

On ... wrote:これは、最初の文字列とその後の文字列の最後までのすべてに一致します。そして、それをOn ... wrote:.

于 2012-11-06T18:32:35.477 に答える
1

おそらくこれを要素ごとに分解できます。したがって、基本的には次のとおりです。

On DATE, "NAME" <EMAIL> wrote:

DATENAME、およびを特徴付けることができますEMAIL

  • DATE数字、ダッシュ、スペース、コロン、および文字で構成されます。ただし、コンマで終わるので、代わりに使用できます。
  • NAME引用符で区切られていますが、文字とスペースで構成されており、おそらくそれを処理できます。
  • EMAILはもう少し複雑ですが、メールには文字>を含めることができないため、それ以外はすべてキャプチャできるはずです。

したがって、基本的には次のようになります。

On [anything but comma], "[anything but "]" <[anything but >]> wrote:

正規表現では、次のようなものです。

/^On ([^,]+), \"([^\"]+)\" <([^>]+)> wrote:$/

次に、 を使用すると、インデックス 1 ~ 3 の配列preg_matchから一致を取得できます。$matches

于 2012-11-06T18:33:28.003 に答える