php - 如何在 PHP 正则表达式中解析 Facebook 事件中的 Ical 文件?
问题描述
我正在尝试解析此数据中的Summary
andDTSTART
字段并考虑使用正则表达式。还尝试逐行阅读,但无法解决实现它的逻辑。
有人帮忙吗?
那里已经有了解析器,但我的要求有点独特,需要不同的目标实现。
BEGIN:VCALENDAR
PRODID:-//Facebook//NONSGML Facebook Events V1.0//EN
X-WR-CALNAME:Friends' birthdays
X-PUBLISHED-TTL:PT12H
X-ORIGINAL-URL:/events/birthdays/
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
BEGIN:VEVENT
DTSTART:20170106
SUMMARY:Gys's birthday
RRULE:FREQ=YEARLY
DURATION:P1D
UID:b1074083@facebook.com
END:VEVENT
BEGIN:VEVENT
DTSTART:20130406
SUMMARY:Geo's birthday
RRULE:FREQ=YEARLY
DURATION:P1D
UID:b1004@facebook.com
END:VEVENT
BEGIN:VEVENT
DTSTART:20120602
SUMMARY:Flo's birthday
RRULE:FREQ=YEARLY
DURATION:P1D
UID:b100895@facebook.com
END:VEVENT
解决方案
此代码将所有文件读入一个数组(使用file()
),然后一次处理每一行。每行分为标签和内容部分,然后根据它是什么标签,它将临时存储数据或将累积的内容添加到整个日历数组中。...
$file = "a.txt";
$calendar = [];
$lines = file($file, FILE_IGNORE_NEW_LINES);
$temp = [];
$type = "";
foreach ( $lines as $line ) {
list($tag,$content) = explode(":", $line);
if ( $tag == "END" ) {
$calendar[$type][] = $temp;
$temp = [];
}
else if ( $tag == "BEGIN" ) {
// If already some content, then store it in calendar and reset
if ( count($temp) > 0 ) {
$calendar[$type][] = $temp;
$temp = [];
}
$type = $content;
}
else {
$temp[$tag] = $content;
}
}
它使用 BEGIN 标记内容将文件各个部分的事件存储在一起,以及它将给出的示例数据文件...
Array
(
[VCALENDAR] => Array
(
[0] => Array
(
[PRODID] => -//Facebook//NONSGML Facebook Events V1.0//EN
[X-WR-CALNAME] => Friends' birthdays
[X-PUBLISHED-TTL] => PT12H
[X-ORIGINAL-URL] => /events/birthdays/
[VERSION] => 2.0
[CALSCALE] => GREGORIAN
[METHOD] => PUBLISH
)
)
[VEVENT] => Array
(
[0] => Array
(
[DTSTART] => 20170106
[SUMMARY] => Gys's birthday
[RRULE] => FREQ=YEARLY
[DURATION] => P1D
[UID] => b1074083@facebook.com
)
[1] => Array
(
[DTSTART] => 20130406
[SUMMARY] => Geo's birthday
[RRULE] => FREQ=YEARLY
[DURATION] => P1D
[UID] => b1004@facebook.com
)
[2] => Array
(
[DTSTART] => 20120602
[SUMMARY] => Flo's birthday
[RRULE] => FREQ=YEARLY
[DURATION] => P1D
[UID] => b100895@facebook.com
)
)
)
推荐阅读
- docker - docker nginx 将端口转发到容器错误
- php - ChartJs - 如何使用 Doughnutlabel 插件更新内部文本
- python - 下载后在python中重命名文件
- reactjs - 离子反应推动组件过渡问题
- python - 如何在具有不同字符编码的文件上运行 Python 文件
- c# - 没有setter的属性不能赋值,但是没有的属性可以
- swift - 使用未解析的标识符“timeR”-> 调用嵌套函数
- sql - SQL Server - 当 WHERE 原因是唯一 ID 时进行多次更新的最有效方法
- javascript - 为什么我的 updatedText 组件没有被渲染?
- shell - 将 XLSX 按 ubuntu 中的行数拆分为多个文件