得到无效的日期和preg_replace它

时间:2016-08-25 11:58:02

标签: php regex

我有这个替换有效日期:

- (void)viewWillAppear:(BOOL)animated {
   [super viewWillAppear:animated]; 
   [self.navigationController setNavigationBarHidden:NO animated:animated];
}

所以这样的日期:2016年8月25日将被替换。

我的问题是,有时用户会写这样的日期:

$date = preg_replace('~(\d{2})/(\d{2})/(\d{2,4})~', '', $date);

我希望能够得到这个。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我会使用strtotime验证日期范围,而不是正则表达式。

$array = array('082/5/2016', '0825/2016', '08/252/016', '08/25/201', '0/85/2016', '08/25/2016');
foreach($array as $key => $date) {
     if(!strtotime($date)) {
         unset($array[$key]); //or handle the invalid date however you want
     }
}
print_r($array);

演示:https://eval.in/628649

答案 1 :(得分:2)

如果您有"字符串,例如日期"在您的输入中,您可以使用具有正向lookbehind的正则表达式来确保数字和正斜杠块包含7到8位数字,然后跟着一个单词边界:

'~\b(?=(?:\D*\d){7,8}\b)\d+(?:/\d+)+\b~'

请参阅regex demo

<强>详情:

  • \b - 领先的字边界
  • (?=(?:\D*\d){7,8}\b) - 前瞻性要求字边界后跟7到8位数字,用任意数量的非数字分隔
  • \d+ - 一位或多位
  • (?:/\d+)+ - 一个或多个/ + 1个或更多个数字
  • 的序列
  • \b - 尾随字边界。

PHP demo

$str = "Text containing \n082/5/2016\n0825/2016\n08/252/016\n08/25/201\n0/85/2016\n08/25/2016"; 
$result = preg_replace('~\b(?=(?:\D*\d){7,8})\d+(?:/\d+)+\b~', "", $str);
echo $result;