3

私は正規表現をデバッグしようとしていますが、私の人生の間、なぜそれがテストファイルで機能するのか理解できませんが、他の場所では機能しません。

生のHTTP応答を受信し、関心のあるセクションを解析しました。

UID:5F12F7DA-10B0-4EE3-820D-B56F0B2FC153
DTSTAMP:20120408T041113Z
CLASS:PUBLIC
CREATED:20120408T041113Z
DESCRIPTION:Testfghfghfghfghfghfghfghfghfghfghfghfghfghfghfgh
DTSTART;TZID=America/New_York:20120410T000000
DTEND;TZID=America/New_York:20120419T010000
LAST-MODIFIED:20120408T041228Z
LOCATION:Philadelphia\, PA
SEQUENCE:1
SUMMARY:Test
TRANSP:OPAQUE

各行は(hex:0D0A)で終わり、これは'\ r\n'である必要があります。

要約の必要性は次のとおりです。

$ this-> Summary = \ Extract \ Extract :: GetSummary($ vevent);

そして、これが機能です:

public static function GetSummary($String) {
            $re1='.*?'; # Non-greedy match on filler
            $re2='(SUMMARY)';   # Word 1
            $re3='(:)'; # Any Single Character 1
            $re4='(.*?)';   # Non-greedy match on filler
            $re5='(\r\n)';  # Any Single Character 2

            if ($c=preg_match_all ("/".$re1.$re2.$re3.$re4.$re5."/is", $String, $matches))
            {

                $word1=$matches[1][0];
                $c1=$matches[2][0];
                $word2=$matches[3][0];
                return $word2;
            }

        }

Preg_match_allは、テストファイルではtrueと評価されますが、プログラムではfalseと評価されます。何か案は?生の文字列が気に入らない、またはテストファイルにコピーされていない(つまり、見つからない)のでしょうか。

4

1 に答える 1

3

最終一致として改行文字だけを使用してみてください。

function GetSummary($String) {
  $re1='.*?';       // Non-greedy match on filler
  $re2='(SUMMARY)'; // Token
  $re3='(:)';       // Separator
  $re4='(.*?)';     // Content
  $re5='\n';        // End of line

  if ($c=preg_match_all ("/".$re1.$re2.$re3.$re4.$re5."/is", $String, $matches))
  {
    $word1=$matches[1][0];
    $c1=$matches[2][0];
    $word2=$matches[3][0];
    return $word2;
  }
}

デモ: http: //ideone.com/zHr2X

それでも機能しない場合は、行末トークンを使用する$か、正規表現を呼び出す前に行末をサニタイズしてみてください。

于 2012-04-10T22:35:27.007 に答える