我有一个从DB选项返回的字符串,允许用户设置她/他的日期格式:
F j, Y然后在我的get_date()函数中返回以下值:
string 'September 24, 2012' (length=18)现在,我需要一个分割该字符串的关联数组:
array(
'day' => 24,
'month' => 'September',
'year' => 2012
)由于不知道用户如何设置她/他的日期,我有一个问题,我不能简单地说F = month, j = day, Y = year。 function允许的所有内容都允许在系统中使用。
问题:如何“匹配”这些?是否有我监督过的本机函数,它告诉我某物是否是一个月/日/年/小时/小时?
编辑:的最大值。我可以使用的PHP版本是PHP5.2.1
发布于 2012-09-29 15:13:28
如果您有PHP5.3或更高版本,请使用DateTime::createFromFormat
$date = DateTime::createFromFormat($inputFormat, $gotDate);
$result = array(
'day' => (int)$date->format('j'),
'month' => $date->format('F'),
'year' => (int)$date->format('Y')
);发布于 2012-09-29 15:13:02
在我看来,首先不应该将该字符串存储在数据库中,而是使用时间戳。
如果你这样做了,你可以使用这样的东西:
$dateTime = new DateTime($theTimestamp);
$date = array(
'day' => $dateTime->format('j'),
'month' => $dateTime->format('F'),
'year' => $dateTime->format('y'),
);如果希望在数组中灵活处理所需内容,则可以创建如下所示的函数:
function buildDateArray($theTimestamp, $elements) {
$dateTime = new DateTime($theTimestamp);
$date = array();
foreach($elements as $key => $format) {
$date[$key] = $dateTime->format($format);
}
}
$theArray = buildDateArray($theTimestamp, array(
'day' => 'j',
'month' => 'F',
'year' => 'y',
));注:DateTime可在5.2.0时使用
发布于 2012-09-30 18:32:45
正如您现在所写的,您手头没有PHP5.3(真的很遗憾),所以您需要解析字符串“手动”。除了PCRE正则表达式之外,还有sscanf。示例:
$date = 'September 24, 2012';
$result = sscanf($date, '%s %2d, %4d', $month, $day, $year);
$parsed = array(
'day' => $day,
'month' => $month,
'year' => $year
);
var_dump($parsed);输出:
array(3) {
'day' =>
int(24)
'month' =>
string(9) "September"
'year' =>
int(2012)
}这将根据您的格式解析输入日期字符串。如果您需要这种更灵活的方法,则需要动态构建模式,并将值与结果数组相关联。
我已经编写了另一个例子来实现这一点。它可能有点脆弱(我增加了一些注释),但它确实有效。当然,我会将它包装成一个函数--更好地处理错误条件--但是我保留了原始代码,以便更好地展示它是如何工作的:
// input variables:
$date = 'September 24, 2012';
$format = 'F j, Y';
// define the formats:
$formats = array(
'F' => array('%s', 'month'), # A full textual representation of a month, such as January or March
'j' => array('%2d', 'day'), # Day of the month, 2 digits with or without leading zeros
'Y' => array('%4d', 'year'), # A full numeric representation of a year, 4 digits
# NOTE: add more formats as you need them
);
// compile the pattern and order of values
$pattern = '';
$order = array();
for($l = strlen($format), $i = 0; $i < $l; $i++) {
$c = $format[$i];
// handle escape sequences
if ($c === '\\') {
$i++;
$pattern .= ($i < $l) ? $format[$i] : $c;
continue;
}
// handle formats or if not a format string, take over literally
if (isset($formats[$c])) {
$pattern .= $formats[$c][0];
$order[] = $formats[$c][1];
} else {
$pattern .= $c;
}
}
// scan the string based on pattern
// NOTE: This does not do any error checking
$values = sscanf($date, $pattern);
// combine with their names
// NOTE: duplicate array keys are possible, this is risky,
// write your own logic this is for demonstration
$result = array_combine($order, $values);
// NOTE: you can then even check by type (string/int) and convert
// month or day names into integers
var_dump($result);在这种情况下,结果是:
array(3) {
'month' =>
string(9) "September"
'day' =>
int(24)
'year' =>
int(2012)
}注意笔记。在我编写它之前,我已经检查了PHP手册中的用户注释,但是这里提供的函数只用于解析一种特定的模式,而这个变体应该在一定程度上是可扩展的。如果您只有这一种格式,那么您可以自然地非动态地创建sscanf字符串。
另见:format equivalent for PHP 5.2 (or lower)
还要注意,由于这是wordpress,月份名称可能会被翻译。
我很肯定你也能得到一个时间戳格式的帖子的日期。对于一个插件来说,仅仅基于post ID来提供这个值而不是解析一些字符串可能会减少一些负担。
最后请注意:只有Wordpress有一个最低的PHP版本,这不一定意味着您的插件需要精确的最低版本,也。特别是在您概述的情况下,PHP5.2不再得到任何支持(它已经死了),您可以帮助插件用户告诉他们应该更新他们的PHP版本。
看起来Wordpress仍然没有给出关于PHP版本的警告,他们停止使用浏览器和他们自己的软件;)没有必要模仿这种糟糕的做法。告诉你的用户,他们处于危险之中,并把他们吓出地狱(或做闪亮的弹出泡泡,以一种不那么危险的方式获得信息。)为你的用户做一个善意的服务,然后有一些东西为双方赢得,做一些优雅的退步,以显示你的良好态度)。
另见:Is there a Wordpress version that is incompatible with PHP 5.3?
如果您感兴趣,可以在PHP.net:https://wiki.php.net/rfc/releaseprocess上找到当前的PHP发布周期。
https://stackoverflow.com/questions/12653859
复制相似问题