0

ソケットから引っ張る文字列があります: (エスケープのない単一の文字列です (/r/n))

PRODID:-//Microsoft Corporation//Outlook 10.0 MIMEDIR//EN
VERSION:2.0
METHOD:PUBLISH
X-CALENDARSERVER-ACCESS:PUBLIC
BEGIN:VTIMEZONE
TZID:Pacific Time
BEGIN:STANDARD
DTSTART:20081101T020000
RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
....

私はそれを持っていたいので、次のようにします:

$data['PRODID'] = -//Microsoft Corporation//Outlook 10.0 MIMEDIR//EN
$data['VERSION'] = 2.0
.......

parse_str を試しましたが、うまくいきませんでした。簡単な方法はありますか?

4

2 に答える 2

1

これを解釈する独自のスクリプトを作成するのは簡単です。

$lines = explode("\r\n", $string);
$parsed = array();
foreach($lines as $line){
    list($key, $value) = explode(":", $line, 2);
    $parsed[$key] = $value;
}

すぐに、スクリプトが意味をなさなくなるポイントが 1 つありますが、それは開始キーの重複です。

これに対処するには、次の行に沿って何かを行うことができます。

$lines = explode("\n", $string);
$parsed = array();
$current = &$parsed;
foreach($lines as $line){
    list($key, $value) = explode(":", $line, 2);
    if ($key == "BEGIN") {
         $parsed[$value] = array();
         $current = &$parsed[$value];
    } else {
         $current[$key] = $value;
    }
}

これにより、次のような出力が得られます

Array
(
    [PRODID] => -//Microsoft Corporation//Outlook 10.0 MIMEDIR//EN
    [VERSION] => 2.0
    [METHOD] => PUBLISH
    [X-CALENDARSERVER-ACCESS] => PUBLIC
    [VTIMEZONE] => Array
        (
            [TZID] => Pacific Time
        )

    [STANDARD] => Array
        (
            [DTSTART] => 20081101T020000
            [RRULE] => FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
        )

)

上記の例では (begin ブロックの後のすべてが、BEGIN の値に基づいてサブ配列のプロパティとして設定されていることに注意してください)。

実際に見てみる

iCalendar パーサーの代替実装については、この質問を見ることができます

于 2013-08-21T21:20:06.223 に答える
0

このようにしますか?

$string = "...." // all the stuff you have there.

$array = array();

// explode on newlines to go through it line by line
foreach(explode("\n", $string) as $line)
{
    // explode again by ':' and set the key/values
    $tmp = explode(':', $line);
    $array[$tmp[0]] = $tmp[1];
}

キーを上書きすることに注意してください。(BEGIN が 2 回あります)。

于 2013-08-21T21:16:33.600 に答える