0

我需要在“2012 年 5 月 27 日星期日上午 6 点 25 分”之前获取所有内容

我希望在“On xxx, xxx xx, xxxx at xx:xx xx”之前得到一切

这里的问题是 5 月、27 日和 6 日的长度都是可变的。什么是这项工作的最佳工具。由于我缺乏正则表达式的经验,我正在尝试使用explode(),但它似乎不能在这里完成这项工作。正则表达式是我最好的选择吗?

[编辑]

我最终使用了答案的组合。我去了:

preg_match("/(.*)On\s+(Sun|Sat|Fri|Thu|Wed|Tue|Mon),\s+(一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月)\s+\d?\d,\s+\d{4}\s+at\s+\d?\d:\d\d\s+[AP]M,/i", $to, $结尾);

4

3 回答 3

2

我猜是这样的:

/On\s+(Sun|Sat|Fri|Thu|Wed|Tue|Mon),\s+(January|February|March|April|May|June|July|August|September|October|November|December)\s+\d?\d,\s+\d{4}\s+at\s+\d?\d:\d\d\s+[AP]M,/i

[编辑]

根据评论:我添加了对不区分大小写的支持(通过将i修饰符添加到正则表达式的末尾)。我还更改了表达式中的空格\s以允许任何空白字符,并添加+以允许单词之间的多个空格。

我没有将其更改为支持长日名称或短月份名称,因为问题指定月份名称的长度是可变的,但没有将日期名称指定为可变的。但是,如果需要,添加这些变体应该足够简单。

[编辑]

$to = "Let me know how this response looks..... On Sun, May 27, 2012 at 6:25 AM, Pr";
preg_match("/On\s+(Sun|Sat|Fri|Thu|Wed|Tue|Mon),\s+(January|February|March|April|May|June|July|August|September|October|November|December)\s+\d?\d,\s+\d{4}\s+at\s+\d?\d:\d\d\s+[AP]M,/i", $to, $end);

此代码适用于您评论中给出的示例。

希望有帮助。

于 2012-05-27T14:35:23.993 回答
1
preg_match('/(.*?) On \w+, \w+ \d?\d, \d+ at \d?\d:\d?\d \w\w,/', 'grab this text here On Sun, May 27, 2012 at 6:25 AM,', $matches);
echo $matches[1];
// echoes 'grab this text here'

(.*?)匹配开头的所有内容,\w+匹配任何字母数字字符 1 次或多次,\d?\d匹配一位或两位数字

于 2012-05-27T14:40:32.777 回答
0

正则表达式会起作用,因为这就是它的用途:根据模式选择数据。但是,您可以在“,”(逗号)上爆炸,然后将前 4 个元素再次内爆在一起以形成您的句子。我怀疑在这种情况下使用正则表达式会更快。

归根结底,这是您的偏好:您更容易阅读和理解。在这种特殊情况下,正则表达式的主要优势是它们可以提取特定的值/模式,因此您可以轻松地将它们留出例如月份。

$dateString = "On Sun, May 27, 2012 at 6:25 AM, some other text here";

// using explode/implode
$result = explode(',',$dateString);

print "we got: " . implode(',', array_slice($result,0,3)) . "\n";

// using regular expression
$pattern = "/On [A-Z,a-z]{3}, [A-Z,a-z]{3} [0-9]+, [0-9]{4} at [0-9,:]+ (?:A|P)M/U";

preg_match($pattern,$dateString,$match);

print "We got: " . $match[0] . "\n";

另请阅读PHP 手册,正则表达式小节以及初始教程

就我个人而言,在这种情况下,我认为 reg exp 可能在视觉和性能方面都过大了。不过一定要学习正则表达式,它们有时会很有帮助。

于 2012-05-27T14:52:37.277 回答