PluginProbe
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress / 11.0.3
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress v11.0.3
11.1.1 11.1.0 11.0.5 11.0.4 11.0.3 11.0.2 11.0.1 11.0.0 10.11.1 10.11.0 10.10.2 10.10.1 10.10.0 10.9.1 trunk 10.0.0 10.0.1 10.1.0 10.1.1 10.1.2 10.1.3 10.1.4 10.2.0 10.2.1 10.2.2 All 62 releases
acymailing / back / Libraries / Imap2 / Roundcube / Utils.php

Utils.php in AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress 11.0.3, at back/Libraries/Imap2/Roundcube/Utils.php

146 lines 4.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * +-----------------------------------------------------------------------+
5 * | This file is part of the Roundcube Webmail client |
6 * | |
7 * | Copyright (C) The Roundcube Dev Team |
8 * | Copyright (C) Kolab Systems AG |
9 * | |
10 * | Licensed under the GNU General Public License version 3 or |
11 * | any later version with exceptions for skins & plugins. |
12 * | See the README file for a full license statement. |
13 * | |
14 * | PURPOSE: |
15 * | Utility class providing common functions |
16 * +-----------------------------------------------------------------------+
17 * | Author: Thomas Bruederli <[email protected]> |
18 * | Author: Aleksander Machniak <[email protected]> |
19 * +-----------------------------------------------------------------------+
20 */
21
22 namespace AcyMailing\Libraries\Imap2\Roundcube;
23
24 use DateTimeZone;
25
26 /**
27 * Utility class providing common functions
28 *
29 * @package Framework
30 * @subpackage Utils
31 */
32 class Utils
33 {
34 /**
35 * Explode quoted string
36 *
37 * @param string $delimiter Delimiter expression string for preg_match()
38 * @param string $string Input string
39 *
40 * @return array String items
41 */
42 public static function explode_quoted_string($delimiter, $string)
43 {
44 $result = [];
45 $strlen = strlen($string);
46
47 for ($q = $p = $i = 0 ; $i < $strlen ; $i++) {
48 if ($string[$i] == "\"" && $string[$i - 1] != "\\") {
49 $q = $q ? false : true;
50 } elseif (!$q && preg_match("/$delimiter/", $string[$i])) {
51 $result[] = substr($string, $p, $i - $p);
52 $p = $i + 1;
53 }
54 }
55
56 $result[] = (string)substr($string, $p);
57
58 return $result;
59 }
60
61 /**
62 * Improved equivalent to strtotime()
63 *
64 * @param string $date Date string
65 * @param DateTimeZone $timezone Timezone to use for DateTime object
66 *
67 * @return int Unix timestamp
68 */
69 public static function strtotime($date, $timezone = null)
70 {
71 $date = self::clean_datestr($date);
72 $tzname = $timezone ? ' '.$timezone->getName() : '';
73
74 // unix timestamp
75 if (is_numeric($date)) {
76 return (int)$date;
77 }
78
79 // It can be very slow when provided string is not a date and very long
80 if (strlen($date) > 128) {
81 $date = substr($date, 0, 128);
82 }
83
84 // if date parsing fails, we have a date in non-rfc format.
85 // remove token from the end and try again
86 while (($ts = @strtotime($date.$tzname)) === false || $ts < 0) {
87 if (($pos = strrpos($date, ' ')) === false) {
88 break;
89 }
90
91 $date = rtrim(substr($date, 0, $pos));
92 }
93
94 return (int)$ts;
95 }
96
97 /**
98 * Clean up date string for strtotime() input
99 *
100 * @param string $date Date string
101 *
102 * @return string Date string
103 */
104 public static function clean_datestr($date)
105 {
106 $date = trim($date);
107
108 // check for MS Outlook vCard date format YYYYMMDD
109 if (preg_match('/^([12][90]\d\d)([01]\d)([0123]\d)$/', $date, $m)) {
110 return sprintf('%04d-%02d-%02d 00:00:00', intval($m[1]), intval($m[2]), intval($m[3]));
111 }
112
113 // Clean malformed data
114 $date = preg_replace(
115 [
116 '/\(.*\)/', // remove RFC comments
117 '/GMT\s*([+-][0-9]+)/', // support non-standard "GMTXXXX" literal
118 '/[^a-z0-9\x20\x09:\/\.+-]/i', // remove any invalid characters
119 '/\s*(Mon|Tue|Wed|Thu|Fri|Sat|Sun)\s*/i', // remove weekday names
120 ],
121 [
122 '',
123 '\\1',
124 '',
125 '',
126 ],
127 $date
128 );
129
130 $date = trim($date);
131
132 // try to fix dd/mm vs. mm/dd discrepancy, we can't do more here
133 if (preg_match('/^(\d{1,2})[.\/-](\d{1,2})[.\/-](\d{4})(\s.*)?$/', $date, $m)) {
134 $mdy = $m[2] > 12 && $m[1] <= 12;
135 $day = $mdy ? $m[2] : $m[1];
136 $month = $mdy ? $m[1] : $m[2];
137 $date = sprintf('%04d-%02d-%02d%s', $m[3], $month, $day, $m[4] ? : ' 00:00:00');
138 } // I've found that YYYY.MM.DD is recognized wrong, so here's a fix
139 elseif (preg_match('/^(\d{4})\.(\d{1,2})\.(\d{1,2})(\s.*)?$/', $date, $m)) {
140 $date = sprintf('%04d-%02d-%02d%s', $m[1], $m[2], $m[3], $m[4] ? : ' 00:00:00');
141 }
142
143 return $date;
144 }
145 }
146