Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.11.x will end 14 Nov 2022 (12 months plus 6 months extension).
  • Bug fixes for security issues in 3.11.x will end 13 Nov 2023 (18 months plus 12 months extension).
  • PHP version: minimum PHP 7.3.0 Note: minimum PHP version has increased since Moodle 3.10. PHP 7.4.x is supported too.
<?php
> /** > declare(strict_types=1);
* SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. *
< * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
> * Copyright (c) 2004-2022, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */
> use SimplePie\Parse\Date;
< /** < * Date Parser < * < * @package SimplePie < * @subpackage Parsing < */ < class SimplePie_Parse_Date < { < /** < * Input data < * < * @access protected < * @var string < */ < var $date; < < /** < * List of days, calendar day name => ordinal day number in the week < * < * @access protected < * @var array < */ < var $day = array( < // English < 'mon' => 1, < 'monday' => 1, < 'tue' => 2, < 'tuesday' => 2, < 'wed' => 3, < 'wednesday' => 3, < 'thu' => 4, < 'thursday' => 4, < 'fri' => 5, < 'friday' => 5, < 'sat' => 6, < 'saturday' => 6, < 'sun' => 7, < 'sunday' => 7, < // Dutch < 'maandag' => 1, < 'dinsdag' => 2, < 'woensdag' => 3, < 'donderdag' => 4, < 'vrijdag' => 5, < 'zaterdag' => 6, < 'zondag' => 7, < // French < 'lundi' => 1, < 'mardi' => 2, < 'mercredi' => 3, < 'jeudi' => 4, < 'vendredi' => 5, < 'samedi' => 6, < 'dimanche' => 7, < // German < 'montag' => 1, < 'mo' => 1, < 'dienstag' => 2, < 'di' => 2, < 'mittwoch' => 3, < 'mi' => 3, < 'donnerstag' => 4, < 'do' => 4, < 'freitag' => 5, < 'fr' => 5, < 'samstag' => 6, < 'sa' => 6, < 'sonnabend' => 6, < // AFAIK no short form for sonnabend < 'so' => 7, < 'sonntag' => 7, < // Italian < 'lunedì' => 1, < 'martedì' => 2, < 'mercoledì' => 3, < 'giovedì' => 4, < 'venerdì' => 5, < 'sabato' => 6, < 'domenica' => 7, < // Spanish < 'lunes' => 1, < 'martes' => 2, < 'miércoles' => 3, < 'jueves' => 4, < 'viernes' => 5, < 'sábado' => 6, < 'domingo' => 7, < // Finnish < 'maanantai' => 1, < 'tiistai' => 2, < 'keskiviikko' => 3, < 'torstai' => 4, < 'perjantai' => 5, < 'lauantai' => 6, < 'sunnuntai' => 7, < // Hungarian < 'hétfő' => 1, < 'kedd' => 2, < 'szerda' => 3, < 'csütörtok' => 4, < 'péntek' => 5, < 'szombat' => 6, < 'vasárnap' => 7, < // Greek < 'Δευ' => 1, < 'Τρι' => 2, < 'Τετ' => 3, < 'Πεμ' => 4, < 'Παρ' => 5, < 'Σαβ' => 6, < 'Κυρ' => 7, < // Russian < 'Пн.' => 1, < 'Вт.' => 2, < 'Ср.' => 3, < 'Чт.' => 4, < 'Пт.' => 5, < 'Сб.' => 6, < 'Вс.' => 7, < ); < < /** < * List of months, calendar month name => calendar month number < * < * @access protected < * @var array < */ < var $month = array( < // English < 'jan' => 1, < 'january' => 1, < 'feb' => 2, < 'february' => 2, < 'mar' => 3, < 'march' => 3, < 'apr' => 4, < 'april' => 4, < 'may' => 5, < // No long form of May < 'jun' => 6, < 'june' => 6, < 'jul' => 7, < 'july' => 7, < 'aug' => 8, < 'august' => 8, < 'sep' => 9, < 'september' => 9, < 'oct' => 10, < 'october' => 10, < 'nov' => 11, < 'november' => 11, < 'dec' => 12, < 'december' => 12, < // Dutch < 'januari' => 1, < 'februari' => 2, < 'maart' => 3, < 'april' => 4, < 'mei' => 5, < 'juni' => 6, < 'juli' => 7, < 'augustus' => 8, < 'september' => 9, < 'oktober' => 10, < 'november' => 11, < 'december' => 12, < // French < 'janvier' => 1, < 'février' => 2, < 'mars' => 3, < 'avril' => 4, < 'mai' => 5, < 'juin' => 6, < 'juillet' => 7, < 'août' => 8, < 'septembre' => 9, < 'octobre' => 10, < 'novembre' => 11, < 'décembre' => 12, < // German < 'januar' => 1, < 'jan' => 1, < 'februar' => 2, < 'feb' => 2, < 'märz' => 3, < 'mär' => 3, < 'april' => 4, < 'apr' => 4, < 'mai' => 5, // no short form for may < 'juni' => 6, < 'jun' => 6, < 'juli' => 7, < 'jul' => 7, < 'august' => 8, < 'aug' => 8, < 'september' => 9, < 'sep' => 9, < 'oktober' => 10, < 'okt' => 10, < 'november' => 11, < 'nov' => 11, < 'dezember' => 12, < 'dez' => 12, < // Italian < 'gennaio' => 1, < 'febbraio' => 2, < 'marzo' => 3, < 'aprile' => 4, < 'maggio' => 5, < 'giugno' => 6, < 'luglio' => 7, < 'agosto' => 8, < 'settembre' => 9, < 'ottobre' => 10, < 'novembre' => 11, < 'dicembre' => 12, < // Spanish < 'enero' => 1, < 'febrero' => 2, < 'marzo' => 3, < 'abril' => 4, < 'mayo' => 5, < 'junio' => 6, < 'julio' => 7, < 'agosto' => 8, < 'septiembre' => 9, < 'setiembre' => 9, < 'octubre' => 10, < 'noviembre' => 11, < 'diciembre' => 12, < // Finnish < 'tammikuu' => 1, < 'helmikuu' => 2, < 'maaliskuu' => 3, < 'huhtikuu' => 4, < 'toukokuu' => 5, < 'kesäkuu' => 6, < 'heinäkuu' => 7, < 'elokuu' => 8, < 'suuskuu' => 9, < 'lokakuu' => 10, < 'marras' => 11, < 'joulukuu' => 12, < // Hungarian < 'január' => 1, < 'február' => 2, < 'március' => 3, < 'április' => 4, < 'május' => 5, < 'június' => 6, < 'július' => 7, < 'augusztus' => 8, < 'szeptember' => 9, < 'október' => 10, < 'november' => 11, < 'december' => 12, < // Greek < 'Ιαν' => 1, < 'Φεβ' => 2, < 'Μάώ' => 3, < 'Μαώ' => 3, < 'Απρ' => 4, < 'Μάι' => 5, < 'Μαϊ' => 5, < 'Μαι' => 5, < 'Ιούν' => 6, < 'Ιον' => 6, < 'Ιούλ' => 7, < 'Ιολ' => 7, < 'Αύγ' => 8, < 'Αυγ' => 8, < 'Σεπ' => 9, < 'Οκτ' => 10, < 'Νοέ' => 11, < 'Δεκ' => 12, < // Russian < 'Янв' => 1, < 'января' => 1, < 'Фев' => 2, < 'февраля' => 2, < 'Мар' => 3, < 'марта' => 3, < 'Апр' => 4, < 'апреля' => 4, < 'Май' => 5, < 'мая' => 5, < 'Июн' => 6, < 'июня' => 6, < 'Июл' => 7, < 'июля' => 7, < 'Авг' => 8, < 'августа' => 8, < 'Сен' => 9, < 'сентября' => 9, < 'Окт' => 10, < 'октября' => 10, < 'Ноя' => 11, < 'ноября' => 11, < 'Дек' => 12, < 'декабря' => 12, < < ); < < /** < * List of timezones, abbreviation => offset from UTC < * < * @access protected < * @var array < */ < var $timezone = array( < 'ACDT' => 37800, < 'ACIT' => 28800, < 'ACST' => 34200, < 'ACT' => -18000, < 'ACWDT' => 35100, < 'ACWST' => 31500, < 'AEDT' => 39600, < 'AEST' => 36000, < 'AFT' => 16200, < 'AKDT' => -28800, < 'AKST' => -32400, < 'AMDT' => 18000, < 'AMT' => -14400, < 'ANAST' => 46800, < 'ANAT' => 43200, < 'ART' => -10800, < 'AZOST' => -3600, < 'AZST' => 18000, < 'AZT' => 14400, < 'BIOT' => 21600, < 'BIT' => -43200, < 'BOT' => -14400, < 'BRST' => -7200, < 'BRT' => -10800, < 'BST' => 3600, < 'BTT' => 21600, < 'CAST' => 18000, < 'CAT' => 7200, < 'CCT' => 23400, < 'CDT' => -18000, < 'CEDT' => 7200, < 'CEST' => 7200, < 'CET' => 3600, < 'CGST' => -7200, < 'CGT' => -10800, < 'CHADT' => 49500, < 'CHAST' => 45900, < 'CIST' => -28800, < 'CKT' => -36000, < 'CLDT' => -10800, < 'CLST' => -14400, < 'COT' => -18000, < 'CST' => -21600, < 'CVT' => -3600, < 'CXT' => 25200, < 'DAVT' => 25200, < 'DTAT' => 36000, < 'EADT' => -18000, < 'EAST' => -21600, < 'EAT' => 10800, < 'ECT' => -18000, < 'EDT' => -14400, < 'EEST' => 10800, < 'EET' => 7200, < 'EGT' => -3600, < 'EKST' => 21600, < 'EST' => -18000, < 'FJT' => 43200, < 'FKDT' => -10800, < 'FKST' => -14400, < 'FNT' => -7200, < 'GALT' => -21600, < 'GEDT' => 14400, < 'GEST' => 10800, < 'GFT' => -10800, < 'GILT' => 43200, < 'GIT' => -32400, < 'GST' => 14400, < 'GST' => -7200, < 'GYT' => -14400, < 'HAA' => -10800, < 'HAC' => -18000, < 'HADT' => -32400, < 'HAE' => -14400, < 'HAP' => -25200, < 'HAR' => -21600, < 'HAST' => -36000, < 'HAT' => -9000, < 'HAY' => -28800, < 'HKST' => 28800, < 'HMT' => 18000, < 'HNA' => -14400, < 'HNC' => -21600, < 'HNE' => -18000, < 'HNP' => -28800, < 'HNR' => -25200, < 'HNT' => -12600, < 'HNY' => -32400, < 'IRDT' => 16200, < 'IRKST' => 32400, < 'IRKT' => 28800, < 'IRST' => 12600, < 'JFDT' => -10800, < 'JFST' => -14400, < 'JST' => 32400, < 'KGST' => 21600, < 'KGT' => 18000, < 'KOST' => 39600, < 'KOVST' => 28800, < 'KOVT' => 25200, < 'KRAST' => 28800, < 'KRAT' => 25200, < 'KST' => 32400, < 'LHDT' => 39600, < 'LHST' => 37800, < 'LINT' => 50400, < 'LKT' => 21600, < 'MAGST' => 43200, < 'MAGT' => 39600, < 'MAWT' => 21600, < 'MDT' => -21600, < 'MESZ' => 7200, < 'MEZ' => 3600, < 'MHT' => 43200, < 'MIT' => -34200, < 'MNST' => 32400, < 'MSDT' => 14400, < 'MSST' => 10800, < 'MST' => -25200, < 'MUT' => 14400, < 'MVT' => 18000, < 'MYT' => 28800, < 'NCT' => 39600, < 'NDT' => -9000, < 'NFT' => 41400, < 'NMIT' => 36000, < 'NOVST' => 25200, < 'NOVT' => 21600, < 'NPT' => 20700, < 'NRT' => 43200, < 'NST' => -12600, < 'NUT' => -39600, < 'NZDT' => 46800, < 'NZST' => 43200, < 'OMSST' => 25200, < 'OMST' => 21600, < 'PDT' => -25200, < 'PET' => -18000, < 'PETST' => 46800, < 'PETT' => 43200, < 'PGT' => 36000, < 'PHOT' => 46800, < 'PHT' => 28800, < 'PKT' => 18000, < 'PMDT' => -7200, < 'PMST' => -10800, < 'PONT' => 39600, < 'PST' => -28800, < 'PWT' => 32400, < 'PYST' => -10800, < 'PYT' => -14400, < 'RET' => 14400, < 'ROTT' => -10800, < 'SAMST' => 18000, < 'SAMT' => 14400, < 'SAST' => 7200, < 'SBT' => 39600, < 'SCDT' => 46800, < 'SCST' => 43200, < 'SCT' => 14400, < 'SEST' => 3600, < 'SGT' => 28800, < 'SIT' => 28800, < 'SRT' => -10800, < 'SST' => -39600, < 'SYST' => 10800, < 'SYT' => 7200, < 'TFT' => 18000, < 'THAT' => -36000, < 'TJT' => 18000, < 'TKT' => -36000, < 'TMT' => 18000, < 'TOT' => 46800, < 'TPT' => 32400, < 'TRUT' => 36000, < 'TVT' => 43200, < 'TWT' => 28800, < 'UYST' => -7200, < 'UYT' => -10800, < 'UZT' => 18000, < 'VET' => -14400, < 'VLAST' => 39600, < 'VLAT' => 36000, < 'VOST' => 21600, < 'VUT' => 39600, < 'WAST' => 7200, < 'WAT' => 3600, < 'WDT' => 32400, < 'WEST' => 3600, < 'WFT' => 43200, < 'WIB' => 25200, < 'WIT' => 32400, < 'WITA' => 28800, < 'WKST' => 18000, < 'WST' => 28800, < 'YAKST' => 36000, < 'YAKT' => 32400, < 'YAPT' => 36000, < 'YEKST' => 21600, < 'YEKT' => 18000, < );
> class_exists('SimplePie\Parse\Date');
< /** < * Cached PCRE for SimplePie_Parse_Date::$day < * < * @access protected < * @var string < */ < var $day_pcre;
> // @trigger_error(sprintf('Using the "SimplePie_Parse_Date" class is deprecated since SimplePie 1.7.0, use "SimplePie\Parse\Date" instead.'), \E_USER_DEPRECATED);
< /** < * Cached PCRE for SimplePie_Parse_Date::$month < * < * @access protected < * @var string < */ < var $month_pcre; < < /** < * Array of user-added callback methods < * < * @access private < * @var array < */ < var $built_in = array(); < < /** < * Array of user-added callback methods < * < * @access private < * @var array < */ < var $user = array(); < < /** < * Create new SimplePie_Parse_Date object, and set self::day_pcre, < * self::month_pcre, and self::built_in < * < * @access private < */ < public function __construct() < { < $this->day_pcre = '(' . implode('|', array_keys($this->day)) . ')'; < $this->month_pcre = '(' . implode('|', array_keys($this->month)) . ')'; < < static $cache; < if (!isset($cache[get_class($this)]))
> if (\false) { > /** @deprecated since SimplePie 1.7.0, use "SimplePie\Parse\Date" instead */ > class SimplePie_Parse_Date extends Date
{
< $all_methods = get_class_methods($this); < < foreach ($all_methods as $method) < { < if (strtolower(substr($method, 0, 5)) === 'date_') < { < $cache[get_class($this)][] = $method; < } < } < } < < foreach ($cache[get_class($this)] as $method) < { < $this->built_in[] = $method; < } < } < < /** < * Get the object < * < * @access public < */ < public static function get() < { < static $object; < if (!$object) < { < $object = new SimplePie_Parse_Date; < } < return $object; < } < < /** < * Parse a date < * < * @final < * @access public < * @param string $date Date to parse < * @return int Timestamp corresponding to date string, or false on failure < */ < public function parse($date) < { < foreach ($this->user as $method) < { < if (($returned = call_user_func($method, $date)) !== false) < { < return $returned; < } < } < < foreach ($this->built_in as $method) < { < if (($returned = call_user_func(array($this, $method), $date)) !== false) < { < return $returned; < } < } < < return false; < } < < /** < * Add a callback method to parse a date < * < * @final < * @access public < * @param callback $callback < */ < public function add_callback($callback) < { < if (is_callable($callback)) < { < $this->user[] = $callback; < } < else < { < trigger_error('User-supplied function must be a valid callback', E_USER_WARNING); < } < } < < /** < * Parse a superset of W3C-DTF (allows hyphens and colons to be omitted, as < * well as allowing any of upper or lower case "T", horizontal tabs, or < * spaces to be used as the time separator (including more than one)) < * < * @access protected < * @return int Timestamp < */ < public function date_w3cdtf($date) < { < static $pcre; < if (!$pcre) < { < $year = '([0-9]{4})'; < $month = $day = $hour = $minute = $second = '([0-9]{2})'; < $decimal = '([0-9]*)'; < $zone = '(?:(Z)|([+\-])([0-9]{1,2}):?([0-9]{1,2}))'; < $pcre = '/^' . $year . '(?:-?' . $month . '(?:-?' . $day . '(?:[Tt\x09\x20]+' . $hour . '(?::?' . $minute . '(?::?' . $second . '(?:.' . $decimal . ')?)?)?' . $zone . ')?)?)?$/'; < } < if (preg_match($pcre, $date, $match)) < { < /* < Capturing subpatterns: < 1: Year < 2: Month < 3: Day < 4: Hour < 5: Minute < 6: Second < 7: Decimal fraction of a second < 8: Zulu < 9: Timezone ± < 10: Timezone hours < 11: Timezone minutes < */ < < // Fill in empty matches < for ($i = count($match); $i <= 3; $i++) < { < $match[$i] = '1'; < } < < for ($i = count($match); $i <= 7; $i++) < { < $match[$i] = '0'; < } < < // Numeric timezone < if (isset($match[9]) && $match[9] !== '') < { < $timezone = $match[10] * 3600; < $timezone += $match[11] * 60; < if ($match[9] === '-') < { < $timezone = 0 - $timezone; < } < } < else < { < $timezone = 0; < } < < // Convert the number of seconds to an integer, taking decimals into account < $second = round((int)$match[6] + (int)$match[7] / (10 ** strlen($match[7]))); < < return gmmktime($match[4], $match[5], $second, $match[2], $match[3], $match[1]) - $timezone; < } < < return false; < } < < /** < * Remove RFC822 comments < * < * @access protected < * @param string $data Data to strip comments from < * @return string Comment stripped string < */ < public function remove_rfc2822_comments($string) < { < $string = (string) $string; < $position = 0; < $length = strlen($string); < $depth = 0; < < $output = ''; < < while ($position < $length && ($pos = strpos($string, '(', $position)) !== false) < { < $output .= substr($string, $position, $pos - $position); < $position = $pos + 1; < if ($pos === 0 || $string[$pos - 1] !== '\\') < { < $depth++; < while ($depth && $position < $length) < { < $position += strcspn($string, '()', $position); < if ($string[$position - 1] === '\\') < { < $position++; < continue; < } < elseif (isset($string[$position])) < { < switch ($string[$position]) < { < case '(': < $depth++; < break; < < case ')': < $depth--; < break; < } < $position++; < } < else < { < break; < } < } < } < else < { < $output .= '('; < } < } < $output .= substr($string, $position); < < return $output; < } < < /** < * Parse RFC2822's date format < * < * @access protected < * @return int Timestamp < */ < public function date_rfc2822($date) < { < static $pcre; < if (!$pcre) < { < $wsp = '[\x09\x20]'; < $fws = '(?:' . $wsp . '+|' . $wsp . '*(?:\x0D\x0A' . $wsp . '+)+)'; < $optional_fws = $fws . '?'; < $day_name = $this->day_pcre; < $month = $this->month_pcre; < $day = '([0-9]{1,2})'; < $hour = $minute = $second = '([0-9]{2})'; < $year = '([0-9]{2,4})'; < $num_zone = '([+\-])([0-9]{2})([0-9]{2})'; < $character_zone = '([A-Z]{1,5})'; < $zone = '(?:' . $num_zone . '|' . $character_zone . ')'; < $pcre = '/(?:' . $optional_fws . $day_name . $optional_fws . ',)?' . $optional_fws . $day . $fws . $month . $fws . $year . $fws . $hour . $optional_fws . ':' . $optional_fws . $minute . '(?:' . $optional_fws . ':' . $optional_fws . $second . ')?' . $fws . $zone . '/i'; < } < if (preg_match($pcre, $this->remove_rfc2822_comments($date), $match)) < { < /* < Capturing subpatterns: < 1: Day name < 2: Day < 3: Month < 4: Year < 5: Hour < 6: Minute < 7: Second < 8: Timezone ± < 9: Timezone hours < 10: Timezone minutes < 11: Alphabetic timezone < */ < < // Find the month number < $month = $this->month[strtolower($match[3])]; < < // Numeric timezone < if ($match[8] !== '') < { < $timezone = $match[9] * 3600; < $timezone += $match[10] * 60; < if ($match[8] === '-') < { < $timezone = 0 - $timezone; < } < } < // Character timezone < elseif (isset($this->timezone[strtoupper($match[11])])) < { < $timezone = $this->timezone[strtoupper($match[11])]; < } < // Assume everything else to be -0000 < else < { < $timezone = 0; < } < < // Deal with 2/3 digit years < if ($match[4] < 50) < { < $match[4] += 2000; < } < elseif ($match[4] < 1000) < { < $match[4] += 1900; < } < < // Second is optional, if it is empty set it to zero < if ($match[7] !== '') < { < $second = $match[7]; < } < else < { < $second = 0; < } < < return gmmktime($match[5], $match[6], $second, $month, $match[2], $match[4]) - $timezone; < } < < return false; < } < < /** < * Parse RFC850's date format < * < * @access protected < * @return int Timestamp < */ < public function date_rfc850($date) < { < static $pcre; < if (!$pcre) < { < $space = '[\x09\x20]+'; < $day_name = $this->day_pcre; < $month = $this->month_pcre; < $day = '([0-9]{1,2})'; < $year = $hour = $minute = $second = '([0-9]{2})'; < $zone = '([A-Z]{1,5})'; < $pcre = '/^' . $day_name . ',' . $space . $day . '-' . $month . '-' . $year . $space . $hour . ':' . $minute . ':' . $second . $space . $zone . '$/i'; < } < if (preg_match($pcre, $date, $match)) < { < /* < Capturing subpatterns: < 1: Day name < 2: Day < 3: Month < 4: Year < 5: Hour < 6: Minute < 7: Second < 8: Timezone < */ < < // Month < $month = $this->month[strtolower($match[3])]; < < // Character timezone < if (isset($this->timezone[strtoupper($match[8])])) < { < $timezone = $this->timezone[strtoupper($match[8])]; < } < // Assume everything else to be -0000 < else < { < $timezone = 0; < } < < // Deal with 2 digit year < if ($match[4] < 50) < { < $match[4] += 2000; < } < else < { < $match[4] += 1900; < } < < return gmmktime($match[5], $match[6], $match[7], $month, $match[2], $match[4]) - $timezone; < } < < return false; < } < < /** < * Parse C99's asctime()'s date format < * < * @access protected < * @return int Timestamp < */ < public function date_asctime($date) < { < static $pcre; < if (!$pcre) < { < $space = '[\x09\x20]+'; < $wday_name = $this->day_pcre; < $mon_name = $this->month_pcre; < $day = '([0-9]{1,2})'; < $hour = $sec = $min = '([0-9]{2})'; < $year = '([0-9]{4})'; < $terminator = '\x0A?\x00?'; < $pcre = '/^' . $wday_name . $space . $mon_name . $space . $day . $space . $hour . ':' . $min . ':' . $sec . $space . $year . $terminator . '$/i'; < } < if (preg_match($pcre, $date, $match)) < { < /* < Capturing subpatterns: < 1: Day name < 2: Month < 3: Day < 4: Hour < 5: Minute < 6: Second < 7: Year < */ < < $month = $this->month[strtolower($match[2])]; < return gmmktime($match[4], $match[5], $match[6], $month, $match[3], $match[7]); < } < < return false; < } < < /** < * Parse dates using strtotime() < * < * @access protected < * @return int Timestamp < */ < public function date_strtotime($date) < { < $strtotime = strtotime($date); < if ($strtotime === -1 || $strtotime === false) < { < return false; < } < < return $strtotime;
} }