2012-03-07 28 views
1

私は、カレンダーイベントを取得し、ユーザーがこれらのイベントを編集できるようにする編集スクリプトを用意しています。PHP preg_match/undefined offset

イベントには3種類あります。単一発生、毎日繰り返し、および毎週繰り返される。

編集スクリプトは3つのタイプすべてを扱います(データのフォーマットはそれぞれ異なります)。

2種類の定期的なイベントに関しては、preg_matchを使用するまで、どのイベントが処理されているのかわかりません。私は2つのpreg_match関数を持っています。最初は毎日繰り返されるイベント用で、2回目は毎週の定期的なイベント用です。

私のコードは、まずイベント情報を含む文字列を日々のpreg_match関数に渡します。変数が割り当てられている場合は問題ありません。

ただし、変数が割り当てられていない場合は、同じ文字列を週単位のpreg_match関数に渡します。ここでエラーが発生します:

Notice: Undefined offset: 

ここでコードを表示します。そもそも

、文字列の2種類:上記の文字列がこれを処理するために、変数$ EVENTTYPE

コードに格納されている

(Daily Recurring Event) 
DTSTART;VALUE=DATE:20120306 DTEND;VALUE=DATE:20120307 RRULE:FREQ=DAILY;INTERVAL=3;UNTIL=20120331 

(Weekly Recurring Event) 
DTSTART;VALUE=DATE:20120201 DTEND;VALUE=DATE:20120201 RRULE:FREQ=WEEKLY;BYDAY=Tu,Fr;UNTIL=20120331 

recurrence_info_day($eventtype); 
$recurrence_type = "daily"; 
if ($d = false){ 
    recurrence_info_weekly($eventtype); 
    $recurrence_type = "weekly"; 
} 

function recurrence_info_day($eventtype){ 
    global $eventstart, $eventend, $eventfrequency, $eventinterval, $eventuntil, $formstartdate, $formenddate, $xyz; 
    $s = $eventtype;  
    preg_match(
     '/^DTSTART;VALUE=DATE:(\d+)\s+DTEND;VALUE=DATE:(\d+)\s+RRULE:FREQ=(\w+);INTERVAL=(\d+);UNTIL=(\d+)/', 
     $s, 
     $recinfod 
    ); 
    $eventstart = $recinfod[1]; 
    $eventend = $recinfod[2]; 
    $eventfrequency = $recinfod[3]; 
    $eventinterval = $recinfod[4]; 
    $eventuntil = $recinfod[5]; 

    $formstartdate = substr($eventstart,4,2)."/".substr($eventstart, 6)."/".substr($eventstart,0,4); 
    $formenddate = substr($eventuntil,4,2)."/".substr($eventuntil, 6)."/".substr($eventuntil,0,4); 

    $d = true; 
    if (!$eventstart){ 
     $d = false; 
    } 
} 

//Weekly recurring events 
function recurrence_info_weekly($eventtype){ 
    global $eventstart, $eventend, $eventfrequency, $eventdays, $eventuntil, $formstartdate, $formenddate; 
    $s = $eventtype; 
    preg_match(
     '/^DTSTART;VALUE=DATE:(\d+)\s+DTEND;VALUE=DATE:(\d+)\sRRULE:FREQ=(\w+);BYDAY= (\d+);UNTIL=(\d+)/', 
     $s, 
     $recinfow 
    ); 
    $eventstart = $recinfow[1]; 
    $eventend = $recinfow[2]; 
    $eventfrequency = $recinfow[3]; 
    $eventdays = $recinfow[4]; 
    $eventuntil = $recinfow[5]; 

    $formstartdate = substr($eventstart,4,2)."/".substr($eventstart, 6)."/".substr($eventstart,0,4); 
    $formenddate = substr($eventuntil,4,2)."/".substr($eventuntil, 6)."/".substr($eventuntil,0,4); 
} 

私は毎日繰り返されるイベントがあります。このスクリプトは必要なときに機能します。

週刊文字列のpreg_match関数に問題があります - recurring_info_weekly() この関数を単独で呼び出した場合、または上記のコードのように定義されていないオフセットエラーが発生しました。 recurring_info_day()関数が機能します。それはエラーを与える週関数です。

すべてのヘルプは高く評価され、あなたに感謝:)

答えて

2

を私はあなたの第二のパターンで問題を参照してください。 BYDAYの後ろの数字を確認していますが、例のアルファベットはその位置にあります。これにより、2番目のパターンでは4つの一致のみが発生し、[5]にアクセスしようとすると未定義のオフセットが発生します。

DTSTART;VALUE=DATE:20120201 DTEND;VALUE=DATE:20120201 RRULE:FREQ=WEEKLY;BYDAY=Tu,Fr;UNTIL=20120331 

/^DTSTART;VALUE=DATE:(\d+)\s+DTEND;VALUE=DATE:(\d+)\sRRULE:FREQ=(\w+);BYDAY=(\d+);UNTIL=(\d+)/ 
//-------------------------------------------------------------------------^^^^^^^ 

代わりに、[A-za-z,]でアルファ文字とコンマと一致することを交換してみてください。毎週の正規表現で

/^DTSTART;VALUE=DATE:(\d+)\s+DTEND;VALUE=DATE:(\d+)\sRRULE:FREQ=(\w+);BYDAY=([A-za-z,]+);UNTIL=(\d+)/ 
//---------------------------------------------------------------------------^^^^^^^ 
1

BYDAY=(\d+)間違っている、\ dは、それが文字列「のMo、FR」に一致しないことを意味している桁の数字を意味します。代わりにTry BYDAY=([\w,]+)

+0

と言えば、正規表現をデバッグするための素晴らしいツールであるブックマークRegExr。 http://gskinner.com/RegExr/ – Janek

関連する問題