正则表达式帮助 - 即使它进入下一行也能捕获值

时间:2012-10-01 18:36:42

标签: php regex scripting

我正在尝试捕获自定义警报监控文本和电子邮件警报系统的特定值,并且取得了相当的成功。但是,有时输入到我的引擎的数据可能有点零星,因此我当前的正则表达式系统失败。

例如,以下是我在电子邮件中收到的内容以及可以获得格式的示例:

示例:

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 

如果有人可以查看我简单的正则表达式项目,并帮助我找到更好的解决方案,我会非常感激!

1 个答案:

答案 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)