PHP预匹配/未定义偏移量

PHP预匹配/未定义偏移量,php,regex,undefined,match,offset,Php,Regex,Undefined,Match,Offset,我有一个编辑脚本,它检索日历事件并允许用户编辑这些事件 有3种类型的事件;单一发生、每日重复和每周重复 编辑脚本处理所有3种类型(其中每种类型的数据格式略有不同) 关于这两种类型的重复事件,在使用preg_match之前,我无法判断正在处理哪一种。我有两个preg_match函数,第一个用于每日重复事件,第二个用于每周重复事件 我的代码首先将包含事件信息的字符串传递到daily preg_match函数中。如果分配了变量,那么就没有问题了 如果变量没有被赋值,那么我会将相同的字符串传递给week

我有一个编辑脚本,它检索日历事件并允许用户编辑这些事件

有3种类型的事件;单一发生、每日重复和每周重复

编辑脚本处理所有3种类型(其中每种类型的数据格式略有不同)

关于这两种类型的重复事件,在使用preg_match之前,我无法判断正在处理哪一种。我有两个preg_match函数,第一个用于每日重复事件,第二个用于每周重复事件

我的代码首先将包含事件信息的字符串传递到daily preg_match函数中。如果分配了变量,那么就没有问题了

如果变量没有被赋值,那么我会将相同的字符串传递给weekly 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函数-recurtive_info_weekly() 当我单独调用这个函数时,或者在上面的代码中,我会得到未定义的偏移量错误。 循环_info_day()函数不起作用。给出错误的只是week函数


感谢您的帮助:)

我发现您的第二种模式有问题。您正在检查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+)/
//---------------------------------------------------------------------------^^^^^^^

BYDAY=(\d+)
在每周正则表达式中不正确,\d表示数字,这意味着它与字符串“Mo,Fr”不匹配
Try BYDAY=([\w,]+)
取而代之。

说到它,bookmark RegExr是调试正则表达式的好工具。