PHP中是否允许通用字符爆炸()

时间:2012-05-27 14:29:05

标签: php regex

我需要在“On Sun,2012年5月27日上午6:25”之前获得所有内容,

我希望在“xxx,xxx xx,xxxx xx:xx xx”之前获得所有内容,

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

[编辑]

我最终使用了一系列答案。我跟着去了:

的preg_match(“/(.*)在\ S +(太阳|星期六|星期五|星期四|星期三|星期二|星期一),\ S +(一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月)\ s + \ d?\ d,\ s + \ d {4} \ s + at \ s + \ d?\ d:\ d \ d \ s + [AP] M,/ i“,$到,$ end);

3 个答案:

答案 0 :(得分: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);

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

希望有所帮助。

答案 1 :(得分: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匹配一位或两位数

答案 2 :(得分: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 manual, Regular Expressions subsection以及初始tutorial

就个人而言,在这种情况下,我认为reg exp可能在视觉上和表现上都是过度的。虽然学习正则表达式,但它们有时会非常有用。