正如您现在所写的那样,您手头没有 PHP 5.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 字符串。
另请参阅:date_create_from_format 等效于 PHP 5.2(或更低版本)
还要注意,因为这是 wordpress,所以可能会翻译月份名称。
而且我很确定您也可以以时间戳格式获取帖子的日期。对于插件而言,仅根据帖子 ID 获取该值而不是解析某些字符串可能会更轻松。
最后一点:只有 Wordpress 有最低 PHP 版本,这并不意味着您的插件也需要这个最低版本。特别是在您概述的情况下,PHP 5.2 不再获得任何支持(它已经死了),您可以帮助您的插件用户告诉他们应该更新他们的 PHP 版本。
看起来 Wordpress 仍然没有给出关于 PHP 版本的警告,它们以某种方式停止使用浏览器和他们自己的软件;)没有必要模仿这种糟糕的做法。告诉您的用户他们处于危险之中并把他们吓跑(或者做闪亮的弹出气泡以一种不那么具有威胁性的方式传达信息。为您的用户提供善意的服务,那么双方都会有所收获双方,做一些优雅的后备来展示你的好态度)。
另请参阅:是否有与 PHP 5.3 不兼容的 Wordpress 版本?
如果您有兴趣,您可以在 PHP.net 上找到当前 PHP 的发布周期:https ://wiki.php.net/rfc/releaseprocess。