从填充物上的非贪婪匹配中获得匹配

时间:2012-03-19 02:39:49

标签: php regex

我还在学习PHP正则表达式(以及一般的正则表达式),并希望在填充器上从非贪婪的匹配中返回匹配时请求一些帮助(我在开源CalDav客户端上工作)叫做Calico,应尽快发布给社区。

我用http://txt2re.com生成这个正则表达式,我无法理解如何检索'$ re4 ='。*?'; #填充物上的非贪婪匹配设法捕获。有人可以帮助我吗?

$txt='BEGIN:VCALENDAR PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:America/New_York X-LIC-LOCATION:America/New_York BEGIN:DAYLIGHT TZOFFSETFROM:-0500 TZOFFSETTO:-0400 TZNAME:EDT DTSTART:19700308T020000 RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3 END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:-0400 TZOFFSETTO:-0500 TZNAME:EST DTSTART:19701101T020000 RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11 END:STANDARD END:VTIMEZONE BEGIN:VEVENT CREATED:20111219T194407Z LAST-MODIFIED:20091219T197731Z DTSTAMP:20111219T194431Z UID:c9bfc6b0-064e-4316-83fe-753db34e67ee SUMMARY:New Test DTSTART;TZID=America/New_York:20111219T150000 DTEND;TZID=America/New_York:20111219T160000 LOCATION:Philadelphia DESCRIPTION:Propfind test. END:VEVENT END:VCALENDAR ';

$re1='.*?'; # Non-greedy match on filler
$re2='(TZID)';  # Word 1
$re3='(:)'; # Any Single Character 1
$re4='.*?'; # Non-greedy match on filler
$re5='( )'; # Any Single Character 2

if ($c=preg_match_all ("/".$re1.$re2.$re3.$re4.$re5."/is", $txt, $matches))
{
    $test = $matches[0][0];
    $word1=$matches[1][0];
    $c1=$matches[2][0];
    $c2=$matches[3][0];
    print "($test) ($word1) ($c1) ($c2) \n";
}

我感兴趣的文字是'TZID:America / New_York',其中我试图抓住'America / New_York'部分。由于TZID最终可以是任何东西(非标准时区的可能性),我只是想抓住从冒号到空白的所有东西。

1 个答案:

答案 0 :(得分:1)

您没有将$re4部分包含在捕获括号中,因此匹配实际上不会保存到$matches

如果您将其更改为$re4='(.*?)';,那么$matches[3][0]将包含'America / New_York'


如果您只是想捕捉时区,可以使用更简单的模式:

if (preg_match("/TZID:(.+?) /is", $txt, $matches))
{
    print $matches[1];
}