2012-03-19 22 views
0

まだPHPの正規表現(および一般的な正規表現)を学習しています。フィラーの非貪欲な試合からの試合を返す際に助けを求めます私はCalicoと呼ばれるオープンソースのCalDavクライアントに取り組んでいます。これはすぐにコミュニティにリリースされるはずです)。フィラーの貪欲でない試合からの一致の取得

私は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"; 
} 

私が興味を持ってtext「はTZID:アメリカ/ニューヨーク」です私はつかむしようとしています、の「アメリカ/ニューヨーク」部分。 TZIDは最終的に何か(非標準のタイムゾーンの可能性)になる可能性があるので、私はコロンから空白まですべてを取得しようとしています。

答えて

1

$re4の部分がキャプチャカッコで囲まれていないので、実際に一致するものは$matchesに保存されません。

あなたが$re4='(.*?)';$matches[3][0]それを変更する場合は、ちょうどあなたが単純なパターンを使用することができ、タイムゾーンを捕獲しようとしている場合は「アメリカ/ニューヨーク」


が含まれていますが:

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

ニース。ありがとうございました。 – user978122

関連する問題