我正在尝试捕获自定义警报监控文本和电子邮件警报系统的特定值,并且取得了相当的成功。但是,有时输入到我的引擎的数据可能有点零星,因此我当前的正则表达式系统失败。
例如,以下是我在电子邮件中收到的内容以及可以获得格式的示例:
示例:
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
我曾经逐行读取文件并且效果很好,但是有些项目会在同一条线上,这让我感到震惊。现在我阅读整个电子邮件文件并搜索我感兴趣的项目。
我正在使用以下REGEX项目来查找相关对象。有些人使用:seperator但正如你在EVENT中看到的那样,这个值最终会出现在下一行,这就是我正常的正则表达式。
REGEX
>/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
如果有人可以查看我简单的正则表达式项目,并帮助我找到更好的解决方案,我会非常感激!
答案 0 :(得分:0)
以{(3}}为例,使用上述解决方案的示例:
\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)