1

現在、次のような正規表現があります。

/^From: ((?!\n\n).)*\nSubject:.+/msu

次のようなブロックを一致させるポイントで:

From: John Smith
Cc: Jane Smith
Subject: cat videos

(つまり、それらが連続するブロックにある場所)、次のように、ブロックを分割する空白行がある場合はそうではありません:

From: John Smith

Subject: cat videos

しかし、これを使用する PHP スクリプトが時々セグメンテーション違反を起こしていることがわかりました。pcre.recursion_limit をより低い数値 (私は 8000 を使用) に設定することでセグメンテーション違反を軽減することができましたが、私がやろうとしていることは再帰をあまり行わなくても実行できるはずだと思います。をキャッチするためにひどく非効率的な方法を使用してい\n\nますか?

4

3 に答える 3

2

これは、単一の正規表現のひどい使い方です。発生しているパフォーマンスの問題に加えて、"From:" の前に "Subject:" 行が表示されるメッセージなどの単純な問題で失敗します。RFC822 電子メール ヘッダーを解析する場合は、実際に解析する必要があります。

ヘッダーの空行ターミネータを見つけます。空白で始まる行を前の行に結合します (つまり、newline-followed-by-whitespace を空白に置き換えます)。各行を最初のコロンで分割し、前後の空白を両側から切り取ります。

または、それを行うための適切なライブラリを見つけてください。

于 2013-08-01T04:39:15.650 に答える