我有一个编辑脚本,可以检索日历事件并让用户编辑这些事件。
有三种类型的事件;单次发生,每日复发,每周复发。
编辑脚本处理所有3种类型(每种类型的数据格式略有不同)。
关于2种类型的重复事件,在使用preg_match之前,我无法分辨哪一个正在处理。我有2个preg_match函数,第一个用于每日重复事件,第二个用于每周重复事件。
我的代码首先将包含事件信息的字符串传递给每日preg_match函数。如果分配了变量,则没有问题。
如果没有分配变量,我会将相同的字符串传递给每周preg_match函数。这是我得到以下错误的地方:
Notice: Undefined offset:
我现在将展示我的代码。
首先,有两种类型的字符串:
(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
以上字符串存储在变量$ eventtype
中处理此问题的代码:
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()函数确实有效。它只是提供错误的周函数。
感谢任何帮助,谢谢:)
答案 0 :(得分:2)
我发现你的第二种模式存在问题。您正在检查BYDAY
后的数字,但您的示例在该位置有字母字符。这将导致第二个模式中只有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 :(得分:1)
BYDAY=(\d+)
不正确,\ d表示数字,这意味着它在字符串“Mo,Fr”上不匹配。而是Try BYDAY=([\w,]+)
。