私が開発したサイトにも同様の機能があります。私たちのユーザーは、サプライヤーから価格を記載したメールを受け取ります。メールの本文をコピーしてサイトのテキストエリアに貼り付け、ボタンをクリックします。次に、テキストを解析して製品と価格を見つけ、その情報をデータベースに貼り付けます。
解析を行うには、どのテンプレートが使用されたかを判断するために行う必要があるように、まずサプライヤーを判断する必要があります。テキスト内の特定の文字列を探します - 通常はサプライヤーの名前、またはサプライヤーの電子メールに固有の行です。のようなメソッドでそれを行います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"]);
}
サプライヤーが使用するフォーマットを制御することはできないため、次のような手段に頼る必要があります。
日付を含む各行の周りの文字列の配列にテキストを分割します (prey_split())
その配列の各要素について、最初の行には日付が含まれ、次の 3 ~ 6 行には製品と価格が含まれます。
日付を取り出してから、文字列を新しい行に分割します
各行について、正規表現を使用して価格($ 000.0000)を見つけて引き出します
製品名として使用する行の残りの部分をトリミングします
prey_split()
、preg_match_all()
および を多く使用しexplode()
ます。特に洗練されていたり汎用的だったりするわけではありませんが、システムは非常に堅牢です。正規表現に少し余裕を持たせることで、コードを変更する必要なく、いくつかの小さな形式の変更を行うことができました。「ウィグルルーム」とは、次のようなことを意味します。スペースを検索しないでください。空白を検索してください。ドル記号と 2 つの数字を検索しないでください。ドル記号と任意の数字を検索してください。そんなささいなこと。
編集:
これは私が数年前にそれについて尋ねた質問です:
テキストを読むためのアルゴリズムまたはパターン