Разбор сложной строки в PHP - PullRequest
1 голос
/ 28 февраля 2012

Мне нужна помощь в разборе строки.

Строка:

DTSTART;VALUE=DATE:**20120201** DTEND;VALUE=DATE:20120202 RRULE:FREQ=**DAILY**;INTERVAL=**2**;UNTIL=**20120331**

(переменные, которые мне нужны, имеют ** по обе стороны от них)

Iнеобходимо назначить значения, выделенные жирным шрифтом, следующим переменным (в том же порядке):

$startdate 
$frequency
$interval
$enddate

Вся помощь приветствуется.Спасибо!

РЕДАКТИРОВАТЬ: фактическая строка:

DTSTART; ЗНАЧЕНИЕ = ДАТА: 20120201 DTEND; ЗНАЧЕНИЕ = ДАТА: 20120202 RRULE: FREQ = DAILY ; INTERVAL = 2 ; UNTIL = 20120331

Я только добавил ** с обеих сторон переменных, чтобы показать, какие из них я хотел (как выделение жирным шрифтом делаетне работает во фрагменте кода)

Ответы [ 4 ]

1 голос
/ 28 февраля 2012

Вы можете сделать это так:

<?php
$s = "DTSTART;VALUE=DATE:**20120201** DTEND;VALUE=DATE:20120202 RRULE:FREQ=**DAILY**;INTERVAL=**2**;UNTIL=**20120331**";

preg_match(
    '/^DTSTART;VALUE=DATE:\*\*(\d+)\*\*\s+DTEND;VALUE=DATE:(\d+)\s+RRULE:FREQ=\*\*(\w+)\*\*;INTERVAL=\*\*(\d+)\*\*;UNTIL=\*\*(\d+)\*\*/',
    $s,
    $matches
);

print_r($matches);
?>

----- 8 <-------------------------------------------------------------------------------- </p>

php file.php

Array
(
    [0] => DTSTART;VALUE=DATE:**20120201** DTEND;VALUE=DATE:20120202 RRULE:FREQ=**DAILY**;INTERVAL=**2**;UNTIL=**20120331**
    [1] => 20120201
    [2] => 20120202
    [3] => DAILY
    [4] => 2
    [5] => 20120331
)
1 голос
/ 28 февраля 2012

Посмотрите на этот класс PHP: http://code.google.com/p/ics-parser/

Он преобразует строку iCal в массив, так что его очень легко обрабатывать.

Array
(
    [0] => Array
        (
            [DTSTART] => 20110105T090000Z
            [DTEND] => 20110107T173000Z
            [DTSTAMP] => 20110121T195741Z
            [UID] => 15lc1nvupht8dtfiptenljoiv4@google.com
            [CREATED] => 20110121T195616Z
            [DESCRIPTION] => This is a short description\nwith a new line. Some "special" 'signs' may be <interesting>\, too.
            [LAST-MODIFIED] => 20110121T195729Z
            [LOCATION] => Kansas
            [SEQUENCE] => 2
            [STATUS] => CONFIRMED
            [SUMMARY] => My Holidays
            [TRANSP] => TRANSPARENT
        )
)
0 голосов
/ 28 февраля 2012

В следующем примере я взрываю строку и выполняю некоторые регулярные выражения и заменяем строки. Возможно, есть лучший подход, так как я не профессионал в области регулярных выражений, но это должно сработать!

$teststr="DTSTART;VALUE=DATE:**20120201** DTEND;VALUE=DATE:20120202 RRULE:FREQ=**DAILY**;INTERVAL=**2**;UNTIL=**20120331**";
$array=explode(";",$teststr);

preg_match("/\*(.*)\*/", $array[1], $matches);
$startdate = str_replace("*", "", $matches[1]);
echo "Startdate:". $startdate ."<br>\n";

preg_match("/\*(.*)\*/", $array[2], $matches);
$frequency = str_replace("*", "", $matches[1]);
echo "Frequency:". $frequency ."<br>\n";

preg_match("/\*(.*)\*/", $array[3], $matches);
$interval = str_replace("*", "", $matches[1]);
echo "Interval:". $interval  ."<br>\n";

preg_match("/\*(.*)\*/", $array[4], $matches);
$enddate = str_replace("*", "", $matches[1]);
echo "Enddate:" . $enddate ."<br>\n";
0 голосов
/ 28 февраля 2012

если требуемое значение находится в пределах **, вы можете использовать разнесение (строка, '**') и использовать альтернативное значение массива

...