109 if (!in_array(
$charset, self::$SUPPORTED_CHARSETS)) {
110 throw new \InvalidArgumentException(
'Unsupported encoding. (Supported encodings: ' . implode(
', ', self::$SUPPORTED_CHARSETS) .
')');
126 $this->lineIndex = 0;
127 $this->startLine = 0;
131 $stream = fopen(
'php://temp',
'r+');
135 } elseif (is_resource(
$input)) {
138 throw new \InvalidArgumentException(
'This parser can only read from strings or streams.');
154 if (3 <= strlen($line)
155 && ord($line[0]) === 0xef
156 && ord($line[1]) === 0xbb
157 && ord($line[2]) === 0xbf) {
158 $line = substr($line, 3);
161 switch (strtoupper($line)) {
162 case 'BEGIN:VCALENDAR' :
169 throw new ParseException(
'This parser only supports VCARD and VCALENDAR files');
172 $this->root =
new $class([],
false);
178 if (strtoupper(substr($line, 0, 4)) ===
'END:') {
188 $name = strtoupper(substr($line, 4));
189 if (
$name !== $this->root->name) {
190 throw new ParseException(
'Invalid MimeDir file. expected: "END:' . $this->root->name .
'" got: "END:' .
$name .
'"');
206 if (strtoupper(substr($line, 0, 6)) ===
'BEGIN:') {
208 $component = $this->root->createComponent(substr($line, 6), [],
false);
214 if (strtoupper(substr($line, 0, 4)) ===
'END:') {
224 $name = strtoupper(substr($line, 4));
225 if (
$name !== $component->name) {
226 throw new ParseException(
'Invalid MimeDir file. expected: "END:' . $component->name .
'" got: "END:' .
$name .
'"');
286 if (!\is_null($this->lineBuffer)) {
288 $this->lineBuffer =
null;
291 $eof = \feof($this->
input);
296 throw new EofException(
'End of document reached prematurely');
312 $nextLine = \rtrim(\fgets($this->
input),
"\r\n");
317 if ($nextLine[0] ===
"\t" || $nextLine[0] ===
" ") {
318 $curLine = \substr($nextLine, 1);
322 $this->lineBuffer = $nextLine;
339 if ($this->options & self::OPTION_FORGIVING) {
340 $propNameToken =
'A-Z0-9\-\._\\/';
342 $propNameToken =
'A-Z0-9\-\.';
345 $paramNameToken =
'A-Z0-9\-';
350 ^(?P<name> [$propNameToken]+ ) (?=[;:]) # property name
352 (?<=:)(?P<propValue> .+)$ # property value
354 ;(?P<paramName> [$paramNameToken]+) (?=[=;:]) # parameter name
356 (=|,)(?P<paramValue> # parameter value
358 \"(?: [$qSafeChar]+)\"
363 preg_match_all($regex, $line, $matches, PREG_SET_ORDER);
380 foreach ($matches as $match) {
382 if (isset($match[
'paramValue'])) {
383 if ($match[
'paramValue'] && $match[
'paramValue'][0] ===
'"') {
384 $value = substr($match[
'paramValue'], 1, -1);
386 $value = $match[
'paramValue'];
391 if (is_null($lastParam)) {
392 throw new ParseException(
'Invalid Mimedir file. Line starting at ' . $this->startLine .
' did not follow iCalendar/vCard conventions');
394 if (is_null($property[
'parameters'][$lastParam])) {
395 $property[
'parameters'][$lastParam] = $value;
396 } elseif (is_array($property[
'parameters'][$lastParam])) {
397 $property[
'parameters'][$lastParam][] = $value;
399 $property[
'parameters'][$lastParam] = [
400 $property[
'parameters'][$lastParam],
406 if (isset($match[
'paramName'])) {
407 $lastParam = strtoupper($match[
'paramName']);
408 if (!isset($property[
'parameters'][$lastParam])) {
409 $property[
'parameters'][$lastParam] =
null;
413 if (isset($match[
'propValue'])) {
414 $property[
'value'] = $match[
'propValue'];
417 if (isset($match[
'name']) && $match[
'name']) {
418 $property[
'name'] = strtoupper($match[
'name']);
423 throw new \LogicException(
'This code should not be reachable');
428 if (is_null($property[
'value'])) {
429 $property[
'value'] =
'';
431 if (!$property[
'name']) {
432 if ($this->options & self::OPTION_IGNORE_INVALID_LINES) {
435 throw new ParseException(
'Invalid Mimedir file. Line starting at ' . $this->startLine .
' did not follow iCalendar/vCard conventions');
443 $namedParameters = [];
444 $namelessParameters = [];
446 foreach ($property[
'parameters'] as
$name => $value) {
447 if (!is_null($value)) {
448 $namedParameters[
$name] = $value;
450 $namelessParameters[] =
$name;
454 $propObj = $this->root->createProperty($property[
'name'],
null, $namedParameters);
456 foreach ($namelessParameters as $namelessParameter) {
457 $propObj->add(
null, $namelessParameter);
460 if (strtoupper($propObj[
'ENCODING']) ===
'QUOTED-PRINTABLE') {
464 if ($this->root->getDocumentType() ===
Document::VCARD21 && isset($propObj[
'CHARSET'])) {
466 $charset = (string)$propObj[
'CHARSET'];
472 $property[
'value'] = utf8_encode($property[
'value']);
474 case 'windows-1252' :
475 $property[
'value'] = mb_convert_encoding($property[
'value'],
'UTF-8',
$charset);
478 throw new ParseException(
'Unsupported CHARSET: ' . $propObj[
'CHARSET']);
480 $propObj->setRawMimeDirValue($property[
'value']);
551 $regex =
'# (?: (\\\\ (?: \\\\ | N | n | ; | , ) )';
562 foreach ($matches as $match) {
632 preg_replace_callback(
635 switch ($matches[2]) {
668 (?: [^:])+ # Anything but a colon
669 (?: "[^"]")* # A parameter in double quotes
670 : # start of the value we really care about
674 preg_match($regex, $this->rawLine, $matches);
676 $value = $matches[1];
679 $value = str_replace(
"\n ",
"\n", $value);
684 if ($this->options & self::OPTION_FORGIVING) {
685 while (substr($value, -1) ===
'=') {
An exception for terminatinating execution or to throw for unit testing.
Exception thrown by parser when the end of the stream has been reached, before this was expected.
Exception thrown by Reader if an invalid object was attempted to be parsed.
parseLine($line)
Parses a line, and if it hits a component, it will also attempt to parse the entire component.
setCharset($charset)
By default all input will be assumed to be UTF-8.
readProperty($line)
Reads a property or component from a line.
parse($input=null, $options=0)
Parses an iCalendar or vCard file.
static $SUPPORTED_CHARSETS
The list of character sets we support when decoding.
setInput($input)
Sets the input buffer.
$lineIndex
The real current line number.
extractQuotedPrintableValue()
Gets the full quoted printable value.
parseDocument()
Parses an entire document.
readLine()
Reads a single line from the buffer.
unescapeParam($input)
Unescapes a parameter value.
static unescapeValue($input, $delimiter=';')
Unescapes a property value.
$stream
PHP stream implementation.
echo;exit;}function LogoutNotification($SessionID){ global $ilDB;$q="SELECT session_id, data FROM usr_session WHERE expires > (\w+)\|/" PREG_SPLIT_NO_EMPTY PREG_SPLIT_DELIM_CAPTURE