1

受信メールを解析し、特定の情報を抽出してデータベースに保存する必要があるプロジェクトに取り組んでいます。postmarkapp を使用して電子メールの本文コンテンツを抽出しているため、テキストのみの中身しかありませんが、現在、最も効率的な方法で電子メールを解析する方法に少しこだわっています。

時間が経つにつれて、受信メールの「受け入れられる」形式をさらに追加する予定ですが、最初はおそらく 4 つの一般的なメールが受信されることになります。つまり、それらは同じ形式と抽出したい情報に従います。 (連絡先の詳細、ID、リンク、略歴) は、(サポートされている形式ごとに) 同じ場所にあります。

一般的なタスクを処理するインターフェイスがあり、サポートされている各形式がそれを実装すると考えていますが、その情報を取得する方法だけが行き詰まっています.

これを行うためのさまざまな方法/テクノロジー、理想的にはPHPに関する考えやアイデアを自由に受け入れますが、他の何かを使用する必要がある場合は問題ありません。

4

2 に答える 2

2

私が開発したサイトにも同様の機能があります。私たちのユーザーは、サプライヤーから価格を記載したメールを受け取ります。メールの本文をコピーしてサイトのテキストエリアに貼り付け、ボタンをクリックします。次に、テキストを解析して製品と価格を見つけ、その情報をデータベースに貼り付けます。

解析を行うには、どのテンプレートが使用されたかを判断するために行う必要があるように、まずサプライヤーを判断する必要があります。テキスト内の特定の文字列を探します - 通常はサプライヤーの名前、またはサプライヤーの電子メールに固有の行です。のようなメソッドでそれを行いますgetParserForText()。そのメソッドは、parseText()メソッドとの単純なインターフェースを実装する Parser オブジェクトを返します。

フォーマットごとに Parser 実装クラスがあります。各クラスのparseText()メソッドは、テキストからデータを取得する責任があります。これらをエレガントで一般的なものにする方法を探しましたが、本当に良い方法が見つかりませんでした。正規表現を組み合わせて使用​​し、文字列を小さなセクションに分割して、文字列を調べています。

擬似コード:

$text = $_POST['emailBody'];
$parser = getParserForText($text);
$result = $parser->parseText($text);
if(count($result["errors"]) > 0)
{
    // handle errors
}
else
{
    saveToDatabase($result["prices"]);
}

サプライヤーが使用するフォーマットを制御することはできないため、次のような手段に頼る必要があります。

  1. 日付を含む各行の周りの文字列の配列にテキストを分割します (prey_split())

  2. その配列の各要素について、最初の行には日付が含まれ、次の 3 ~ 6 行には製品と価格が含まれます。

  3. 日付を取り出してから、文字列を新しい行に分割します

  4. 各行について、正規表現を使用して価格($ 000.0000)を見つけて引き出します

  5. 製品名として使用する行の残りの部分をトリミングします

prey_split()preg_match_all()および を多く使用しexplode()ます。特に洗練されていたり汎用的だったりするわけではありませんが、システムは非常に堅牢です。正規表現に少し余裕を持たせることで、コードを変更する必要なく、いくつかの小さな形式の変更を行うことができました。「ウィグルルーム」とは、次のようなことを意味します。スペースを検索しないでください。空白を検索してください。ドル記号と 2 つの数字を検索しないでください。ドル記号と任意の数字を検索してください。そんなささいなこと。

編集:

これは私が数年前にそれについて尋ねた質問です: テキストを読むためのアルゴリズムまたはパターン

于 2012-12-05T16:01:23.113 に答える
0

これは生成された電子メールであるため、命令ごとに 1 行など、簡単に解析できる形式になっている可能性が高くなります。key=value. 次に、最初の=-sign で行を分割し、これによって得られるキーと値のペアを使用できます。

正規表現は、受信データ形式を制御できない場合に最適ですが、制御する場合は、正規表現なしで解析可能であることを確認する方が簡単です。

このような単純な解析には形式が複雑すぎる場合は、その形式を使用したファイルの例を挙げてください。回答をより具体的にすることができます。これが質問の意図に対する回答でない場合も同様です。希望する回答の例を挙げてください。

于 2012-12-01T13:12:56.610 に答える