0

メンテナンス ヘルプ デスクから電子メールがパイプされる PHP スクリプトをセットアップしています。これらの電子メールは、私が制御できないクライアント企業が使用する Web フォームから送信されます。メールの形式は標準化されていますが、Web フォームから供給されるラベル付きのリストが含まれています。正規表現を使用してこのリストを分割し、ラベルと値を配列に入れて、自分のデータベースにフィードできるようにしたいと考えています。私は外出先で実用的なソリューションを持っていますが、私は正規表現が初めてで、それを行うためのより良い/より効率的な方法があると確信しています.

受信する可能性のある電子メールの例:

Dear *MY COMPANY*,

A new job has been raised, please see details below.
If you are unable to action this job request, please notify the Maintenance Help Desk on xxx-xxxx as soon as possible.

    Job Type: Man In Van
    Job Code: 1462399
    Due Date: 27/09/2012 07:21:10
    Response Time: Man In Van
    Pub Number: 234
    Pub Name: pub name, location
    Pub Address: 123 somewhere, some place XX1 7XX
    Pub Post Code: XX1 7XX
    Pub Telephone Number: xxx xxxx
    Placed By: Ben
    Date/time placed: 20/09/2012 07:21:10
    Trade Type: Man In Van
    Description: List of jobs emailed by Chris, carried out by Martin Baker. No callout on system currently, although jobs already completed, just need signing off.


    For any queries, please either contact the pub directly, telephone the Maintenance Help Desk on xxx-xxxx or reply to this e-mail.

Many Thanks
*CLIENT COMPANY* 

その周りには定型文があり、明らかにメールヘッダーなどがありますが、アイデアはわかります. 各メールには 1 つのリストしか含まれておらず、ラベルは同じままですが、将来的に証明したいので、新しいフィールドが追加された場合でもコードを変更する必要はありません。次のような配列になりたいです。

$job['Job Type'] = Man in van
$job['Job Code'] = 1462399
...
$job['Description'] = List of all jobs emailed ... just need signing off.

形式が変更されないことは確信できますが、すべてのフォームはユーザー入力であるため、予測できない可能性があります。特に、改行が含まれる可能性のある説明です。

これは私が現在使用しているコードです:

// Rip out the job details from the email
preg_match_all('/job type\:.*description\:.*\s{3}F/is', $the_email, $jobs);

    for each job returned (should always be one but hey)
    foreach($jobs[0] as $job_details) {

// Get the variables from the job description
    preg_match_all('/(\w[^\:]*)\: ([\w\d][^\*]+)/i', $job_details, $the_vars);

}

    // For each row returned, put into an array with the first group as the key and the second as the value
for ($i=0; $i<count($the_vars[0]); $i++) {

    $arr[$the_vars[1][$i]] = $the_vars[2][$i];

}

それは機能しますが、醜いので、もっと良い方法があると確信しています。私が抱えている主な問題は説明セクションです。説明自体に改行が含まれている可能性があるため、「:」記号に続くテキストを改行まで単純に検索することはできません。

どんなアドバイスでも大歓迎です!

4

1 に答える 1

0

まだ世界で最も美しいものではありませんが、うまくいくはずです!

preg_match_all('/\s{3}[ ]*([^:]+): ([^\n]+)/', $subject, $matches);
$job = array_combine($matches[1], $matches[2]);

preg_match_all('/Description\: (.*)\s{3}For any queries/is', $subject, $match);
$job['Description'] = trim($match[1][0]);

最初preg_match_allは、あなたが言ったことは実際には機能しません。空白、コロン、改行ですべてのフィールドを取得するだけです。

2 番目のキーは、最初のキーで入力された誤った可能性のある説明キーを置き換えます。

于 2012-09-20T21:49:21.780 に答える