使用不同的传入字符串格式进行字符串拆分和截断

时间:2012-08-15 20:26:10

标签: php google-calendar-api str-replace

我拥有的: 一个字符串,上面写着“2012年8月7日星期二至2012年8月28日星期二”

我想要的: 一个字母“8月7日 - 8月28日”

唯一的问题是有时我把它作为一个字符串:

“2012年8月31日星期五下午7:30至9:30”

我需要这样做: “8月31日”

这是来自Google日历Feed的信息,因此根据用户是否投入了开始时间等,传入的字符串会有所不同。感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

案例1

$string = 'Fri Aug 31, 2012 7:30pm to 9:30pm';

$pieces = explode(' to ', $string);

$d1 = strtotime($pieces[0]);

if(isset($pieces[1])) {
    $d2 = strtotime($pieces[1]);
    if(date('M j', $d1) == date('M j', strtotime($pieces[1], $d1))) {
        echo date('M j', $d1);
    }
    else echo date('M j', $d1) . " - " . date('M j', $d2);
}
else {
    echo date('M j', $d1);
}

结果: 8月31日

案例2

$string = 'Tue Aug 7, 2012 to Tue Aug 28, 2012';

结果: 8月7日 - 8月28日

案例3

$string = 'Tue Aug 7, 2012';

结果: 8月7日

答案 1 :(得分:1)

您可以使用preg_match_all功能简化逻辑:

$str1 = "Tue Aug 7, 2012 to Tue Aug 28, 2012";
$str2 = "Fri Aug 31, 2012 7:30pm to 9:30pm";

$pattern = '/(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d+/';
$numMatches = preg_match_all($pattern, $str1, $dates);

if ($numMatches == 1) // case 2
    echo $dates[0][0];
else // case 1
    echo $dates[0][0]." - ".$dates[0][1];

DEMO (change $str1 to $str2 in preg_match_all to test case 2)

只要您的字符串中有一个或多个格式为MON DMON DD的日期,此功能就可以使用。无论字符串的其余部分是如何格式化的,只是存在月份和日期。

答案 2 :(得分:1)

检查此变体:

$ in =“2012年8月7日星期二至2012年8月28日星期二”; // $ in =“2012年8月31日星期五下午7:30至4:30”;

$reg = '~(\w{3}) (\w{3}) (\d{1,2}), (\d{4}) (\d{1,2}:\d{2}(?:pm|am) )?to (?:(\w{3}) (\w{3}) (\d{1,2}), (\d{4})|(\d{1,2}:\d{2}(?:pm|am)))~i';
$in = preg_replace_callback($reg, function($m) {
    if (!$m[6] && !$m[9]) {
        return "{$m[2]} {$m[3]}";
    }
    else return "{$m[2]} {$m[3]} - {$m[7]} {$m[8]}";
}, $in);


echo $in;

对于"Tue Aug 7, 2012 to Tue Aug 28, 2012"打印Aug 7 - Aug 28,对于"Fri Aug 31, 2012 7:30pm to 4:30am",您获得Aug 31