这两天在做的项目中需要对用户输入的日期进行匹配,匹配的格式范围 包括:

2001.4.3

六月五号

七月十五

一一年四月三日

二零一三年五月六日

01年3月7日

2011年3月31日

今天、明天、下周一、周六

使用的是正则来处理,值得注意的是再utf8编码下,正则使用\u选项就能在表达式中直接输入中文。一下贴出代码:

  1     //时间标识%6.5%
  2     private function analyze_time( $content ){
  3         $time = false;
  4
  5         if( preg_match( '/%.*?%/', $content, $matches ) ){
  6             $time_str = trim( substr( $matches[0], 1, strlen( $matches[0] ) - 2 ) );
  7             $time = $this -> analyze_time_day( $time_str );
  8             (!$time ) && $time = $this -> analyze_time_week( $time_str );
  9             (!$time ) && $time = $this -> analyze_time_date( $time_str );
 10         }
 11         return $time;
 12     }
 13
 14     function analyze_time_day( $content ){
 15         $day = array(
 16             '今天' => 0,
 17             '明天' => 3600 * 24,
 18             '后天' => 3600 * 48,
 19             '大后天' => 3600 * 72,
 20         );
 21         return isset( $day[$content] )?$day[$content]:false;
 22     }
 23
 24 function analyze_time_week( $content ){
 25
 26
 27         $now = now();
 28         $time = 0;
 29         $week = array( "周", "礼拜", "星期" );
 30         $week_pre = array( "下", "下个" );
 31         $week_day = array( "一" => 1, "二" => 2, "三" => 3, "四" => 4, "五" => 5, "六" => 6, "天" => 7, "日" => 7 );
 32
 33         //模式一,匹配 "周一" , "下周一", "周日";
 34         $reg1 = "/^(" . implode( "|", $week_pre ) . ")?(" . implode( "|", $week ) . ")(" . implode( "|", array_keys( $week_day ) ) . ")/u";
 35         preg_match_all( $reg1, $content, $match );
 36         if( (!empty( $match[0] )) && (!empty( $match[2] )) && (!empty( $match[3] )) ){
 37             //匹配结果数组 1:下; 2:星期 3:一
 38             //判断今天
 39             $w = date( "w", $now );
 40             $w == 0 && $w = 7;
 41             //判断输入时期
 42             $w_2 = $week_day[$match[3][0]];
 43             if( empty( $match[1][0] ) ){
 44                 $time = $w_2 - $w > 0 ? 3600 * 24 * ($w_2 - $w) : 0;
 45             }else{
 46                 $time = 3600 * 24 * ($w_2 - $w + 7 );
 47             }
 48         }
 49         return $time == 0 ? false : ( int ) $now + ( int ) $time;
 50     }
 51
 52 function analyze_time_date( $content ){
 53         $now = now();
 54         $content = str_replace( ".", "-", $content );
 55         if( strtotime( $content ) ){
 56             return strtotime( $content );
 57         }
 58
 59         $number = array( "零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二" );
 60         $number_2 = $number;
 61         $number_2 = array_splice( $number_2, 1, 10 );
 62         $reg2_2 = "/(0?[1-9]|10|11|12|[" . implode( "", $number_2 ) . "]|(十一|十二))月([012]?[0-9]|30|31|(十|二十|三十)?[" . implode( "", $number_2 ) . "十]?)日?/u";
 63         preg_match_all( $reg2_2, $content, $match );
 64 //        print_r( $match );
 65         //匹配数组 1:月份 3:日
 66
 67         if( (!empty( $match[0] )) && (!empty( $match[1][0] )) && (!empty( $match[3][0] )) ){
 68             $str_month = $match[1][0];
 69             $str_day = $match[3][0];
 70             $month = is_numeric( $str_month ) ? $str_month : false;
 71             if( !$month ){
 72                 foreach( $number as $k => $v ){
 73                     if( $v == $str_month ){
 74                         $month = $k;
 75                     }
 76                 }
 77             }
 78 //            echo "month:{$month}";
 79
 80             $day = is_numeric( $str_day ) ? $str_day : false;
 81             if( !$day ){
 82                 $day = array_search( $str_day, $number );
 83                 if( !$day ){
 84                     $number_3 = $number;
 85                     $number_3 = array_splice( $number_3, 1, 9 );
 86                     $re_day = preg_match_all( "/([一二三])?(十)([" . implode( "", $number_3 ) . "])?/u", $str_day, $match_2 );
 87                     $day = array_search( $match_2[1][0], $number ) ? array_search( $match_2[1][0], $number ) * 10 : 10;
 88                     $day += array_search( $match_2[3][0], $number ) ? array_search( $match_2[3][0], $number ) : 0;
 89                 }
 90             }
 91 //            echo "day:{$day}";
 92
 93             if( $month == false || $day == false ){
 94                 return false;
 95             }
 96
 97             if( $match[0][0] == $content ){
 98                 //无年份前缀
 99                 $output = date( "Y", $now ) . "-" . $month . "-" . $day;
100             }else{
101                 //有年份前缀
102                 $year = $this -> analyze_time_year( str_replace( $match[0][0], "", $content ) );
103                 if( $year ){
104                     $output = $year . "-" . $month . "-" . $day;
105                 }else{
106                     return false;
107                 }
108             }
109             return strtotime( $output );
110         }
111         return false;
112     }
113
114
115 function analyze_time_year( $content ){
116         $number = array( "零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十" );
117
118
119         //模式二 --一,匹配年 2001年,01年,零一年,二九年,二零一九年
120         //1-9
121         $number_1 = $number;
122         $number_1 = array_splice( $number_1, 0, 10 );
123         $reg2_1 = "/((20|二零)?([12一二])([0-9]|[" . implode( "", $number_1 ) . "]))(?(1)年)/u";
124         preg_match_all( $reg2_1, $content, $match );
125         if( (!empty( $match[0] )) && (!empty( $match[3][0] )) && (!empty( $match[4][0] )) ){
126             $day = ( is_numeric( $match[3][0] ) ? $match[3][0] : array_search( $match[3][0], $number ) ) * 10;
127             $day += is_numeric( $match[4][0] ) ? $match[4][0] : array_search( $match[4][0], $number );
128         }else{
129             return false;
130         }
131
132         return $day ? $day + 2000 : false;
133     }

每个函数都可以单独使用。

转载于:https://www.cnblogs.com/sskyy/archive/2012/06/13/2547293.html

php对用户输入的非标准格式日期匹配相关推荐

  1. php java 私钥 转换格式,php公钥私钥 3 ---非标准格式转换为标准格式

    PHP RSA 报错 openssl_sign(): supplied key param cannot be coerced into a private key 私钥 private functi ...

  2. MaxCompute平台非标准日期和气象数据处理方法--以电力AI赛为例

    摘要:MaxCompute平台支持的日期格式通常是对齐的日期格式诸如20170725或2017/07/25这种,而本次电力AI赛提供的日期格式却是未对齐的非标准(相对MaxCompute平台来说)的日 ...

  3. python-非标准格式json文件读取报错解决办法

    不是所有以.json结尾的文件,里面的数据都是标准的json格式. 如,以下名为countries.json文件中的数据格式,就是非标准化的json数据格式. 注:json标准格式中,字符串必须用双引 ...

  4. python输入end退出循环_python练习:从入门到实践——用户输入和while循环

    目录 一.函数 input() 的原理 1.1 编写清晰的程序 1.3 求模运算 二.while 循环简介 2.1 使用 while 循环 2.2 让用户选择何时退出 2.3 使用标志 2.4 使用 ...

  5. vs中如何对布局、代码进行快速标准格式排版

    问题产生来源 有一次看代码时有一种醍醐灌顶的感觉,我以为不是自己写的,排版也比较乱.空格很多.但事实上就只有我一个人写,突然让我想起了很多往事-真是往事不堪回首啊. 一定要严格要求自己编码规范,这是这 ...

  6. Java黑皮书课后题第4章:*4.15(电话键盘)电话上的国际标准字母/数字映射如下所示。编写程序,提示用户输入一个小写或大写字母,然后显示对应数字。对于非字母输入,提示非法输入

    *4.15(电话键盘)电话上的国际标准字母/数字映射如下所示.编写程序,提示用户输入一个小写或大写字母,然后显示对应数字.对于非字母输入,提示非法输入 题目 题目概述 运行示例 破题 代码 题目 题目 ...

  7. Java黑皮书课后题第6章:*6.21(电话按键盘)国际标准的字母/数字匹配图如编程练习题4.15所示。编写一个测试程序,提示用户输入字符串形式的电话号码。程序将字母(大写或小写)翻译成数字

    6.21(电话按键盘) 题目 题目描述与运行示例 破题 代码 题目 题目描述与运行示例 6.21(电话按键盘)国际标准的字母/数字匹配图如编程练习题4.15所示,编写一个方法,返回给定大写字母的数字, ...

  8. Java黑皮书课后题第5章:**5.45(统计:计算平均值和标准方差)在商务应用中……编写一个程序,提示用户输入10个数字,然后运用下面的公式,显示这些数字的平均值以及标准方差

    5.45(统计:计算平均值和标准方差)在商务应用中--编写一个程序,提示用户输入10个数字,然后运用下面的公式,显示这些数字的平均值以及标准方差 题目 题目描述 破题 运行示例 代码 题目 题目描述 ...

  9. Java黑皮书课后题第4章:*4.13(判断元音还是辅音)编写程序,提示用户输入一个字母,判断该字母是元音还是辅音。对于非字母的输入,提示非法输入

    *4.13(判断元音还是辅音)编写程序,提示用户输入一个字母,判断该字母是元音还是辅音.对于非字母的输入,提示非法输入 题目 题目概述 运行示例 破题 代码 题目 题目概述 *4.13(判断元音还是辅 ...

最新文章

  1. webpack 配置 babel
  2. java 消息机制 ActiveMQ入门实例
  3. vs2010利用属性表自动配置OpenCV(win7的64位系统,opencv版本是2.4.10)
  4. css class选择器用法,CSS类选择器用法简明介绍
  5. linux镜像文件不要大于4g,Systemback制作大于4G的Ubuntu系统镜像
  6. Android中WebView加载本地Html,与JavaScript与Android方法相互传值...
  7. 数据挖掘应用的一些场景和对应算法
  8. iPhone 13 Pro系列最新渲染图曝光:小刘海+大尺寸后置相机模组
  9. jQuery中绑定事件的几种方法
  10. 为什么大家拍摄视频不用摄像机,反而选用单反照相机呢?
  11. 下面属于python内置对象的有哪些_Python内置对象实现的方法及注意事项
  12. matlab中 mcc、mbuild和mex命令详解
  13. 数学中的皇冠——数论
  14. 如何系统学习SWAT模型—建模方法、实例应用、高级进阶
  15. Fences有一个桌面分区消失了怎么办
  16. JAVA日期格式化大写YYYY-MM-dd和小写yyyy-MM-DD的坑
  17. iOS面试--最新快手iOS面试题
  18. 计算机硬件 系统安装维护教程 02安装基础篇-02:MBR与GPT、分区、活动分区
  19. 小程序源码:图片秒加水印制作生成-多玩法安装简单
  20. autogluon--自动机器学习快速训练模型

热门文章

  1. bzoj 2115: [Wc2011] Xor(DFS+线性基)
  2. 结构体符号重载(简单版+手动扩栈方法)
  3. [再学Python] - 6 - 函数的定义调用与返回
  4. [再学Python] - 2 - math库和random库
  5. 文档协作编辑 ONLYOFFICE 部署和使用教程
  6. python数据挖掘案例系列教程——python实现搜索引擎
  7. 学习笔记(13):组合不同类型的数据
  8. python书写跨越多行的字符串的两种方式
  9. C# 设置Excel中的数字字符串格式
  10. java callable