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

Php 使用不同格式的传入字符串拆分和截断字符串,php,google-calendar-api,str-replace,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日历提要的信息,因此传入的字符串根据用户是否输入了开始时间等而有所不同。感谢您的帮助 案例1 结果:8月31日 案例2 结果:8月7日至28日 案例3 结果:8月7日您可以使用该功能简化逻辑: $str1 =

我所拥有的: 写着“2012年8月7日星期二至2012年8月28日星期二”的字符串

我想要的是: 表示“8月7日-8月28日”的字符串

唯一需要注意的是,有时我会将其作为字符串:

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

因此,我需要这个: “8月31日”

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

案例1 结果:8月31日

案例2 结果:8月7日至28日

案例3 结果:8月7日

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

$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];


每当字符串中有一个或多个格式为
mond
mondd
的日期时,此功能就会起作用。不管字符串的其余部分是如何格式化的,只要存在月份和日期即可。

检查此变量:

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


对于
“2012年8月7日星期二至2012年8月28日星期二”
打印
8月7日至8月28日
,对于
“2012年8月31日星期五下午7:30至凌晨4:30”
您得到的是
8月31日
因此传入的格式可能会有所不同?你有什么常数?比如说,是否总是有一个“to”呢?我很难相信google calendar不能提供更标准的日期格式。google calendar是否提供了一个XML提要,可以将这些数据分解成更容易操作的节点?谢谢你的评论。上面的两个例子是我使用字符串的唯一两种不同方式。这只是来自谷歌的全部信息流的一小部分,所以我不会改变数据的接收方式。regex
“/(一月、二月、三月、四月、五月、六月、七月、八月、九月、十月、十一月、十二月)\[0-9]+/”
将匹配适当的日期。您可以手动删除重复项,然后加入其余项。谢谢。我需要弄清楚如何使用我现在返回的阵列(新手问题),但我认为这会起作用。再次感谢!我在第二行看到“Parse error:syntax error,unexpected T_FUNCTION”(右,是时候更新到PHP5.3;)出于某种奇怪的原因,这似乎回想起了结束日期总是12月31日?乔尔,你能详细说明一下吗?在sandbox中效果很好:没什么可说的……如果我回显$string,我会得到准确的字符串,但回显日期会给出12月31日的结束日期。@Joel你是否重用案例1中的代码并替换
$string
?这对我来说很有效。非常感谢。
$string = 'Tue Aug 7, 2012 to Tue Aug 28, 2012';
$string = 'Tue Aug 7, 2012';
$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];
$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;