php对用户输入的非标准格式日期匹配
这两天在做的项目中需要对用户输入的日期进行匹配,匹配的格式范围 包括:
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对用户输入的非标准格式日期匹配相关推荐
- php java 私钥 转换格式,php公钥私钥 3 ---非标准格式转换为标准格式
PHP RSA 报错 openssl_sign(): supplied key param cannot be coerced into a private key 私钥 private functi ...
- MaxCompute平台非标准日期和气象数据处理方法--以电力AI赛为例
摘要:MaxCompute平台支持的日期格式通常是对齐的日期格式诸如20170725或2017/07/25这种,而本次电力AI赛提供的日期格式却是未对齐的非标准(相对MaxCompute平台来说)的日 ...
- python-非标准格式json文件读取报错解决办法
不是所有以.json结尾的文件,里面的数据都是标准的json格式. 如,以下名为countries.json文件中的数据格式,就是非标准化的json数据格式. 注:json标准格式中,字符串必须用双引 ...
- python输入end退出循环_python练习:从入门到实践——用户输入和while循环
目录 一.函数 input() 的原理 1.1 编写清晰的程序 1.3 求模运算 二.while 循环简介 2.1 使用 while 循环 2.2 让用户选择何时退出 2.3 使用标志 2.4 使用 ...
- vs中如何对布局、代码进行快速标准格式排版
问题产生来源 有一次看代码时有一种醍醐灌顶的感觉,我以为不是自己写的,排版也比较乱.空格很多.但事实上就只有我一个人写,突然让我想起了很多往事-真是往事不堪回首啊. 一定要严格要求自己编码规范,这是这 ...
- Java黑皮书课后题第4章:*4.15(电话键盘)电话上的国际标准字母/数字映射如下所示。编写程序,提示用户输入一个小写或大写字母,然后显示对应数字。对于非字母输入,提示非法输入
*4.15(电话键盘)电话上的国际标准字母/数字映射如下所示.编写程序,提示用户输入一个小写或大写字母,然后显示对应数字.对于非字母输入,提示非法输入 题目 题目概述 运行示例 破题 代码 题目 题目 ...
- Java黑皮书课后题第6章:*6.21(电话按键盘)国际标准的字母/数字匹配图如编程练习题4.15所示。编写一个测试程序,提示用户输入字符串形式的电话号码。程序将字母(大写或小写)翻译成数字
6.21(电话按键盘) 题目 题目描述与运行示例 破题 代码 题目 题目描述与运行示例 6.21(电话按键盘)国际标准的字母/数字匹配图如编程练习题4.15所示,编写一个方法,返回给定大写字母的数字, ...
- Java黑皮书课后题第5章:**5.45(统计:计算平均值和标准方差)在商务应用中……编写一个程序,提示用户输入10个数字,然后运用下面的公式,显示这些数字的平均值以及标准方差
5.45(统计:计算平均值和标准方差)在商务应用中--编写一个程序,提示用户输入10个数字,然后运用下面的公式,显示这些数字的平均值以及标准方差 题目 题目描述 破题 运行示例 代码 题目 题目描述 ...
- Java黑皮书课后题第4章:*4.13(判断元音还是辅音)编写程序,提示用户输入一个字母,判断该字母是元音还是辅音。对于非字母的输入,提示非法输入
*4.13(判断元音还是辅音)编写程序,提示用户输入一个字母,判断该字母是元音还是辅音.对于非字母的输入,提示非法输入 题目 题目概述 运行示例 破题 代码 题目 题目概述 *4.13(判断元音还是辅 ...
最新文章
- webpack 配置 babel
- java 消息机制 ActiveMQ入门实例
- vs2010利用属性表自动配置OpenCV(win7的64位系统,opencv版本是2.4.10)
- css class选择器用法,CSS类选择器用法简明介绍
- linux镜像文件不要大于4g,Systemback制作大于4G的Ubuntu系统镜像
- Android中WebView加载本地Html,与JavaScript与Android方法相互传值...
- 数据挖掘应用的一些场景和对应算法
- iPhone 13 Pro系列最新渲染图曝光:小刘海+大尺寸后置相机模组
- jQuery中绑定事件的几种方法
- 为什么大家拍摄视频不用摄像机,反而选用单反照相机呢?
- 下面属于python内置对象的有哪些_Python内置对象实现的方法及注意事项
- matlab中 mcc、mbuild和mex命令详解
- 数学中的皇冠——数论
- 如何系统学习SWAT模型—建模方法、实例应用、高级进阶
- Fences有一个桌面分区消失了怎么办
- JAVA日期格式化大写YYYY-MM-dd和小写yyyy-MM-DD的坑
- iOS面试--最新快手iOS面试题
- 计算机硬件 系统安装维护教程 02安装基础篇-02:MBR与GPT、分区、活动分区
- 小程序源码:图片秒加水印制作生成-多玩法安装简单
- autogluon--自动机器学习快速训练模型
热门文章
- bzoj 2115: [Wc2011] Xor(DFS+线性基)
- 结构体符号重载(简单版+手动扩栈方法)
- [再学Python] - 6 - 函数的定义调用与返回
- [再学Python] - 2 - math库和random库
- 文档协作编辑 ONLYOFFICE 部署和使用教程
- python数据挖掘案例系列教程——python实现搜索引擎
- 学习笔记(13):组合不同类型的数据
- python书写跨越多行的字符串的两种方式
- C# 设置Excel中的数字字符串格式
- java callable