Лучший способ разобрать строку iCalendar в php - PullRequest
1 голос
/ 04 декабря 2009

Я пытаюсь написать класс, который может анализировать файл iCalendar, и я бью некоторые кирпичные стены. Каждая строка может быть в формате:

PARAMETER[;PARAM_PROPERTY..]:VALUE[,VALUE2..]

Довольно просто разобрать либо кучку разбиений, либо регулярные выражения, пока вы не обнаружите, что значения могут иметь запятую в обратном порядке, также они могут быть отмечены двойной кавычкой, что усложняет жизнь. например:

PARAMETER:"my , cool, value",value\,2,value3

В этом примере вы должны извлечь три значения:

  • мое, классное значение
  • значение, 2
  • value3

Что делает его немного сложнее.

Предложения

Ответы [ 4 ]

3 голосов
/ 25 декабря 2009

Просмотрите файл char по char и разделите значения вручную, когда у вас есть кавычка, вы входите в «режим кавычек», где вы не будете разделять запятыми, а когда появляется заключительная кавычка, вы покидаете ее.

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

Конечно, это не очень эффективно, но вы не можете использовать регулярные выражения для этого. Я имею в виду, что вы можете, но, поскольку я верю, что кавычки тоже можно избежать, это будет очень грязно.

Если вы хотите попробовать это:

  • давайте начнем с сопоставления кавычки, за которой следуют символы, которые не являются: "[^"]*"
  • для преодоления проблемы с экранированными персонажами вы можете использовать lookaheads (?<!\\)"[^"]*(?<!\\)"
  • теперь он сломается, если в значении есть экранированные кавычки, может, это работает? (Не проверял) (?<!\\)"[^"|(?<=\\)"]*(?<!\\)"

Таким образом, вы видите, что это очень быстро становится грязным, поэтому я бы посоветовал вам прочитать его по символам.

1 голос
/ 28 декабря 2009

У меня были такие же проблемы. Мне было трудно преобразовать «любой» файл iCalendar в пригодную для использования структуру PHP / объект / массив, поэтому вместо этого я пытался преобразовать iCalendar в xCal.

Это моя реализация:

http://code.google.com/p/sabredav/source/browse/branches/caldav/lib/Sabre/CalDAV/ICalendarToXML.php

Я должен сказать, что этот скрипт не полностью протестирован, но этого может быть достаточно для начала работы.

0 голосов
/ 23 января 2010

Вы думаете об этом проекте? Я являюсь автором :) Первая полезная версия (v0.1.0) должна быть готова примерно через месяц. Он способен работать примерно с 85% спецификации iCalendar прямо сейчас, но повторяющиеся события действительно сложны. Я работаю над ними прямо сейчас. Как только они будут завершены, библиотека будет полностью способна делать что-либо в спецификации.

qCal Главная страница кода Google

Наслаждайтесь!

0 голосов
/ 25 декабря 2009

Вы пытались что-то вытащить из http://phpicalendar.net/?

...