Iets uit een flinke string zien te filteren
Ik heb een string welke uit een CalDAV connectie wordt opgehaald.
Nu moet ik slechts een aantal delen van deze string eruit zien te filteren op een effectieve en snelle manier, want er worden nogal wat strings uitgelezen.
Als voorbeeld wil ik uit deze string het gedeelte tussen SUMMARY: en UID: hebben
Zo zal er ook nog wel wat bij DESCRIPTION moeten worden gevist.
Als ik eenmaal de truck weet voor SUMMARY, is de rest niet zo moeilijk meer.
BEGIN:VCALENDAR VERSION:2.0 PRODID:-//Webmail//NONSGML Calendar//EN BEGIN:VTIMEZONE TZID:Europe/Amsterdam BEGIN:DAYLIGHT DTSTART:20140330T030000Z RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=03 TZNAME:CEST TZOFFSETFROM:+0100 TZOFFSETTO:+0200 END:DAYLIGHT BEGIN:STANDARD DTSTART:20141026T020000Z RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 TZNAME:CET TZOFFSETFROM:+0200 TZOFFSETTO:+0100 END:STANDARD END:VTIMEZONE BEGIN:VEVENT DTSTART;TZID=Europe/Amsterdam:20140528T080000 DTEND;TZID=Europe/Amsterdam:20140528T160000 DTSTAMP:20140805T134904Z SEQUENCE:1407246544 SUMMARY:Een afspraak UID:20140514T112204Z-6461@9da172b963ffe1ab BEGIN:VALARM ACTION:DISPLAY DESCRIPTION: Afspraak TRIGGER;VALUE=DURATION:-P2D END:VALARM END:VEVENT END:VCALENDAR
Met preg_replace en backticks kom ik er niet uit.
is een iCal-parser geen beter idee?
De bedoeling is om met zo min mogelijk libs en overhead gewoon een kalender uit te lezen en dit te tonen op een website zonder fancy stuff.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$aMatch = array();
$b = preg_match('#SUMMARY:(.*)DESCRIPTION:#', $string, $aMatch);
?>
$aMatch = array();
$b = preg_match('#SUMMARY:(.*)DESCRIPTION:#', $string, $aMatch);
?>
of komen er ook nog enters voor in de string in kwestie, of kan DESCRIPTION: meermaals voorkomen?
Dacht eerst aan strippen van de string, maar was vergeten dat je met preg_match je match uiteindelijk er zo uit kan krijgen.
Ik heb steeds de eerste in de reeks nodig, en anders pak ik hem wel met preg_match_all.
Top! Dank!
Als DESCRIPTION vaker voorkomt, dan zul je mogelijk het hele stuk tussen de eerste SUMMARY: en de laatste DESCRIPTION: vinden.
Was ff knoeien met de (.*) en het niet meenemen van de \n en zo, maar (\S*) en eindigen met /s maakt het nu volledig functionerend inclusief de uitzonderingen die er zijn in de Calendar data.
Ivo P op 06/08/2014 15:02:20:
Als DESCRIPTION vaker voorkomt, dan zul je mogelijk het hele stuk tussen de eerste SUMMARY: en de laatste DESCRIPTION: vinden.
Dat is te voorkomen door ungreedy te matchen:
$b = preg_match('#SUMMARY:(.*?)DESCRIPTION:#', $string, $aMatch);
Heeft als bijkomend voordeel dat het meestal ook een heel klein beetje sneller is, omdat de regex-parser minder hoeft te backtracken.