我有一个从套接字拉出的字符串:(它是一个没有转义的单个字符串(/ 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但是没有用。有一个简单的方法吗?
答案 0 :(得分:1)
编写自己的脚本来解释这一点非常简单。
$lines = explode("\r\n", $string);
$parsed = array();
foreach($lines as $line){
list($key, $value) = explode(":", $line, 2);
$parsed[$key] = $value;
}
我立即看到一个点,你的脚本将停止有意义,这是重复的开始键。
为了解决这个问题,你可以按照以下方式做点什么:
$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的值将开始块之后的所有内容设置为子数组的属性)。
对于iCalendar Parser的替代实现,您可以看到this question
答案 1 :(得分: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两次)。