2

カスタムアラーム監視テキストおよび電子メールアラートシステムの特定の値を取得しようとしていますが、ある程度成功しています。ただし、エンジンに供給されるデータが散発的になることがあるため、現在の正規表現システムは機能しません。

たとえば、これは私が電子メールで受け取ったものとそれが得ることができるフォーマットの例です:

例:

CS#: A192255
Site Name: Home Alarm
Date and Time: Oct  1 2012  7:37AM                                       =
   User #: 17
User Name: User# 17                                               Event: =
CEE400 - OPEN                                               Zone: E401 - =
Caller_ID:  =0A=
=0D 

以前はファイルを 1 行ずつ読んでいましたが、うまくいきましたが、いくつかのアイテムが同じ行に表示されてしまい、私を爆破しました。ここで、電子メール ファイル全体を読み、興味のある項目を検索します。

関連するオブジェクトを見つけるために、次の REGEX アイテムを使用しています。: セパレーターを使用する人もいますが、EVENT でわかるように、値は最終的に次の行にあり、通常の正規表現を台無しにします。

正規表現

>/CS#:(.*?)A[0-9]{6}/
/Site Name:(.*?)[a-zA-Z0-9\'\"\-\_\[\]\s]{0,30}[\r\n]/
/Date and Time:(.*?)[a-zA-Z]{3}(.*?)[0-9]{1,2}(.*?)[0-9]{4}(.*?)[0-9]{1,2}:[0-9]{2}[a-zA-Z]{2}/
/CEE[0-9]{3}|CIE[0-9]{3}/ - For the EVENT: line
/Zone:(.*?)[0-9]{1,3}[a-zA-Z0-9\s\'\"\-\_\[\]\s]{0,50}+/
"/User #:(.*?)[0-9]{1,3}/

この特定の問題については、SITE NAME 項目で 30 文字まで、または改行に達するまでの文字列を探しています。それが機能しているように見えた後、次のメールを受け取り、「= 20」文字までキャプチャしました。

例 2

CS#: A197789
Site Name: Made up name (F/A)
111E 1st Street=20
Somewhere, AZ 99999
Date and Time: Oct  1 2012  9:14AM
Event: CEE602 - TIMER TEST
Zone: E602 -  Caller_ID: timer test
Site Phone 1: 
Site Phone 2:=20
System Description: NX 8 Caddx LF=0A=
=0D 

誰かが私の素朴な正規表現アイテムを見て、より良い解決策を見つけるのを手伝ってくれたら、とても感謝しています!

4

1 に答える 1

0

これは、前述のソリューションの例を使用したRubular demoです。

\s*([^:]+?)\s*:\s*(.*(?:\s*(?!.*:).*)*)\s*

編集:

アイデアを提供するためのPHPコードを次に示します。

$str = 'CS#: A197789
Site Name: Made up name (F/A)
111E 1st Street=20
Somewhere, AZ 99999
Date and Time: Oct 1 2012 9:14AM
Event: CEE602 - TIMER TEST
Zone: E602 - Caller_ID: timer test
Site Phone 1: 
Site Phone 2:=20
System Description: NX 8 Caddx LF=0A=
=0D';

preg_match_all('/\s*([^:]+?)\s*:\s*(.*(?:\s*(?!.*:).*)*)\s*/m',
               $str,
               $matches,
               PREG_SET_ORDER);

foreach ($matches as $match) {
    echo "$match[1] => $match[2] <br>";
}

出力:

CS# => A197789
Site Name => Made up name (F/A)
111E 1st Street=20 Somewhere, AZ 99999 Date and Time => Oct 1 2012 9:14AM
Event => CEE602 - TIMER TEST
Zone => E602 - Caller_ID: timer test
Site Phone 1 =>
Site Phone 2 => =20
System Description => NX 8 Caddx LF=0A= 

「日付と時刻:」の問題の解決はあなたに任せます... (ヒント: 午前 9 時 14 分)

于 2012-10-01T18:57:08.487 に答える