php 正则验证日期时间格式实例代码

 更新时间:2016年11月25日 15:03  点击:1278
利用php来验证日期格式我们可以使用checkdate()函数与正则表达式来验证,下面我一一给各位同学介绍了我在验证日期格式一些过程,最终得出最简单办法。

1.使用正则验证日期时间格式
主要使用ereg、preg_match等php函数。
有个非常简单的,

 代码如下 复制代码
$dateTime=”2010-6-4 00:00:00″;
if(preg_match(“/^d{4}-d{2}-d{2} d{2}:d{2}:d{2}$/s”,$dateTime))
{
echo “Yes”;
}else{
echo “No”;
}

可是这个正则只验证了数字,并未对边界值进行验证,并不全面,于是有人写了这个正则

 代码如下 复制代码

regex = “^((d{2}(([02468][048])|([13579][26]))[-/s]?((((0?[13578]
)|(1[02]))[-/s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[4
69])|(11))[-/s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[-/
s]?((0?[1-9])|([1-2][0-9])))))|(d{2}(([02468][1235679])|([1
3579][01345789]))[-/s]?((((0?[13578])|(1[02]))[-/s]?((
0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[-/s]?((
0?[1-9])|([1-2][0-9])|(30)))|(0?2[-/s]?((0?[1-9])|(1[0-9]
)|(2[0-8])))))) “; //日期部分
regex += “(s(((0?[0-9])|([1-2][0-3])):([0-5]?[0-9])((s)|(:([0-5]?[0-9])))))?$”; //时间部分

丫的这简直就是神的作品。
于是我不得不放弃使用正则来验证时间格式合法性。

2.对时间字符串进行拆解分别验证日期时间格式。
主要用到checkdate等php函数。
这个方法很不错,验证也准确,可是代码写起来麻烦,需要将日期和时间分别拆解,日期使用checkdate($k[1],$k[2],$k[0])验证,时间又需要拆解逐个检查。

其实可以综合了上述两种方法来使用,操作也方便得多。
1.首先使用正则验证是否为“2011-11-07 12:30:55”这种格式。

 代码如下 复制代码
preg_match(“/^d{4}-d{2}-d{2} d{2}:d{2}:d{2}$/s”,$dateTime)

就可以了
2.然后使用strtotime()函数判断验证,传入日期字符串即可。
strtotime()函数默认返回指定日期时间字符串对应的UNIX时间戳。
strtotime()函数有个特点,就是如果传入日期字符串格式错误的话会返回false,而且支持各种的日期格式,非常方便。

PHP 可以自动进行内存管理,清除不再需要的对象。PHP使用了引用计数(reference counting)这种单纯的垃圾回收(garbage collection)机制。每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为 NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间

php 5.3之前使用的垃圾回收机制是单纯的“引用计数”,也就是每个内存对象都分配一个计数器,当内存对象被变量引用时,计数器+1;当变量引用撤掉后,计数器-1;当计数器=0时,表明内存对象没有被使用,该内存对象则进行销毁,垃圾回收完成。

“引用计数”存在问题,就是当两个或多个对象互相引用形成环状后,内存对象的计数器则不会消减为0;这时候,这一组内存对象已经没用了,但是不能回收,从而导致内存泄露;

php5.3开始,使用了新的垃圾回收机制,在引用计数基础上,实现了一种复杂的算法,来检测内存对象中引用环的存在,以避免内存泄露。

 

php变量存在一个叫"zval"的变量容器中,"zval"变量容器包括含变量的类型和值,还包括额外的两个字节信息,分别是“is_ref”表示变量是否属于引用,“refcount”指向这个zval变量容器的变量个数。

如果你安装了xdebug,就可以用xdebug_debug_zval()显示“zval”的信息了。如下:

<?php
 $str = "www.111cn.net";
 xdebug_debug_zval('str');


结果:

str:

(refcount=1, is_ref=0),

string 'phpddt.com' (length=10)

只有当变量容器在”refcount“变成0时就被销毁.当你unset()一个变量时,想要的“zval”中refcount就会减1,再来说说前几天遇到的unset引用问题:

 

 代码如下 复制代码

<?php
 $a = "aaa";
 $b = & $a;
 unset($a);
 //echo $b; //这里依然会输出aaa,用xdebug_debug_zval打印你就知道为什么了
 xdebug_debug_zval("b");

 

结果:

b:

(refcount=1, is_ref=0),string 'aaa' (length=3)

继续说引用计数器问题,对于array和object符合类型情况又不一样了:

 

 代码如下 复制代码

<?php
 
 $arr = array( 'a' => 'aaa', 'b' => "bbb" );
 xdebug_debug_zval( 'arr' );
 $arr['aaa'] = $arr['a'];
 xdebug_debug_zval( 'arr' );
?>


结果:

arr:

(refcount=1, is_ref=0),

array

  'a' => (refcount=1, is_ref=0),string 'aaa' (length=3)

  'b' => (refcount=1, is_ref=0),string 'bbb' (length=3)

arr:

(refcount=1, is_ref=0),

array

  'a' => (refcount=2, is_ref=0),string 'aaa' (length=3)

  'b' => (refcount=1, is_ref=0),string 'bbb' (length=3)

  'aaa' => (refcount=2, is_ref=0),string 'aaa' (length=3)


可以看到看到原有的数组元素和新添加的数组元素关联到同一个"refcount"2的zval变量容器.这里我也只是起到抛砖引玉的作用。

上面我们只是简单的使用了unset,null,mysql_close,__destruct,xdebug_debug_zval 接着往下看


查看内存是否泄露

看是否有该释放的内存没有被释放,可以简单的通过 调用  memory_get_usage  函数查看内存使用情况来判断;memory_get_usage 函数返回的内存使用数据据说不是很准确,可以使用  php 的 xdebug 扩展来获得更准确翔实的内存使用情况。

 代码如下 复制代码

class A{
    private $b;
    function __construct(){
        $this->b = new B($this);
    }
    function __destruct(){
        //echo "A destructn";
    }
}

class B{
    private $a;
    function __construct($a){
        $this->a = $a;
    }
    function __destruct(){
        //echo "B descturctn";
    }
}

for($i=0;;$i++){
    $a = new A();
    if($i%1000 == 0){
        echo memory_get_usage()."n";
    }

}

}

上面就构造了一个会产生环状引用的例子;每次创建一个A对象的实例a,a就创建一个B对象的实例b,同时让b引用a ;这样,每个A对象永远被一个B引用,而每个B对象同时被一个对象A引用;引用环就这样产生了。

在php5.2的环境下执行这段代码,会发现内存使用在单调上涨,也没有A和B的析构函数被执行后输出的“A/B desctruct”信息;直到内存耗尽,输出“PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 40 bytes)”。

在php5.3的环境下执行这段代码,则发现内存使用在上跳下窜,但是永远没有超过一个限额;程序也会输出大量的“A/B desctruct”,这说明析构函数被调用了。

我的同事的程序中,就存在这种引用的环路,而他的脚本,实在php5.2.3下执行的。simple_html_dom工具中,有两个类,分别是simple_html_dom和simple_html_dom_node,前者中有一个数组成员变量nodes,数组中每个元素都是一个simple_html_dom_node对象;而每个simple_html_dom_node对象都有一个成员变量dom,该dom的值就是前面的simple_html_dom对象——这样就形成了一个漂亮的引用环,导致了内存泄露。解决的办法也很简单,就是simple_html_dom对象在使用完毕时,主动调用其clear函数,清空其成员变量nodes,环就被打破了,内存泄露也就不会发生了。

 


3.其他:

1)垃圾回收的时机


Php中,引用计数为0,则内存立刻释放;也就是说,不存在环状引用的变量,离开变量的作用域,内存被立刻释放。

环状引用检测则是在满足一定条件下触发,所以在上面的例子中,会看到使用的内存有大幅度的波动;也可以通过 gc_collect_cycles 函数来主动进行环状引用检测。

2) &符号的影响

显式引用一个变量,会增加该内存的引用计数:

$a = "something";

$b = &$a;

此时unset($a), 但是仍有$b指向该内存区域的引用,内存不会释放。

3)unset函数的影响

unset只是断开一个变量到一块内存区域的连接,同时将该内存区域的引用计数-1;在上面的例子中,循环体内部,$a=new A(); unset($a);并不会将$a的引用计数减到零;

4)= null 操作的影响;

$a = null 是直接将$a 指向的数据结构置空,同时将其引用计数归0。

5)脚本执行结束的影响

脚本执行结束,该脚本中使用的所有内存都会被释放,不论是否有引用环。

随机抽取一些元素这个功能实现方法很简单,只要使用array_rand与range就可以实现了,如果随便抽取一个元素就直接使用mt_rand然后长成随机数长度不超过数组长度即可。

下面我先给大家提供几种方法,供大家参考。


方法-:

 代码如下 复制代码

$arr = range(1,10,1);
   
$newarr = array_rand($arr,6);    //随机获取6个数组中的键
   
$newArr = array_flip($newarr);   //键与值互换
   
$arr3 = array_diff_key($arr,$newArr); //取键相同的
   
$arr1 = array_diff_key($arr,$arr3);  //取键相同的
   
print_r($arr1);

结果: Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [5] => 6 [9] => 10 )

方法二:

 代码如下 复制代码

$arr = range(1,10,1);
   
$newarr = array_rand($arr,6);    //随机获取6个数组中的键
   
$ArrNew = array();
   
foreach($newarr as $k=>$v)

   $ArrNew[$v] = $arr[$v];    
}
   
print_r($ArrNew);

结果:Array ( [1] => 2 [2] => 3 [3] => 4 [4] => 5 [6] => 7 [7] => 8 )

方法三:这种方法没有保留键名,供大家参考一下.

 代码如下 复制代码

$arr = range(1,10,1);
  
shuffle($arr);   //打乱数组
  
$newarr = array_splice($arr,0,6);
  
print_r($newarr);

结果:Array ( [0] => 7 [1] => 4 [2] => 2 [3] => 10 [4] => 9 [5] => 6 )

在mysql中如果我们想利用PHP创建数据库和表方法很简单,我们可以直接使用mysql_query()来执行mysql的创建表命令,CREATE DATABASE database_name即可。

具体如下

为了让 PHP 执行上面的语句,我们必须使用 mysql_query() 函数。此函数用于向 MySQL 连接发送查询或命令。

例子

在下面的例子中,我们创建了一个名为 “my_db” 的数据库:

 代码如下 复制代码

<?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
 {
 die('Could not connect: ' . mysql_error());
 }
if (mysql_query("CREATE DATABASE my_db",$con))
 {
 echo "Database created";
 }
else
 {
 echo "Error creating database: " . mysql_error();
 }
mysql_close($con);
?>

创建表

CREATE TABLE 用于在 MySQL 中创建数据库表。

例子

下面的例子展示了如何创建一个名为 “Persons” 的表,此表有三列。列名是 “FirstName”, “LastName” 以及 “Age”:

 

 代码如下 复制代码
<?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
 {
 die('Could not connect: ' . mysql_error());
 }
// Create database
if (mysql_query("CREATE DATABASE my_db",$con))
 {
 echo "Database created";
 }
else
 {
 echo "Error creating database: " . mysql_error();
 }
// Create table in my_db database
mysql_select_db("my_db", $con);
$sql = "CREATE TABLE Persons
(
FirstName varchar(15),
LastName varchar(15),
Age int
)";
mysql_query($sql,$con);
mysql_close($con);
?>

向数据库表插入数据

您还可以规定希望在其中插入数据的列:

INSERT INTO table_name (column1, column2,...)
VALUES (value1, value2,....)

例子

在前面的章节,我们创建了一个名为 “Persons” 的表,有三个列:”Firstname”, “Lastname” 以及 “Age”。我们将在本例中使用同样的表。下面的例子向 “Persons” 表添加了两个新记录:

 代码如下 复制代码
<?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
 {
 die('Could not connect: ' . mysql_error());
 }
mysql_select_db("my_db", $con);
mysql_query("INSERT INTO Persons (FirstName, LastName, Age)
VALUES ('Peter', 'Griffin', '35')");
mysql_query("INSERT INTO Persons (FirstName, LastName, Age)
VALUES ('Glenn', 'Quagmire', '33')");
mysql_close($con);
?>

--------------------------------------------------------------------------------
把来自表单的数据插入数据库

 代码如下 复制代码

<html>
<body>
<form action="insert.php" method="post">
Firstname: <input type="text" name="firstname" />
Lastname: <input type="text" name="lastname" />
Age: <input type="text" name="age" />
<input type="submit" />
</form>
</body>
</html>

当用户点击上例中 HTML 表单中的提交按钮时,表单数据被发送到 “insert.php”。”insert.php” 文件连接数据库,并通过 $_POST 变量从表单取回值。然后,mysql_query() 函数执行 INSERT INTO 语句,一条新的记录会添加到数据库表中。

下面是 “insert.php” 页面的代码:

 

 代码如下 复制代码
<?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
 {
 die('Could not connect: ' . mysql_error());
 }
mysql_select_db("my_db", $con);
$sql="INSERT INTO Persons (FirstName, LastName, Age)
VALUES
('$_POST[firstname]','$_POST[lastname]','$_POST[age]')";
if (!mysql_query($sql,$con))
 {
 die('Error: ' . mysql_error());
 }
echo "1 record added";
mysql_close($con)
?>
在php中如果要判断浏览器类型操作方法很简单的,我们只要利用全局变量HTTP_USER_AGENT就可以获取用户浏览器信息,这样我们就可以利用正则加以判断类型或浏览器版本了。

PHP如何判断浏览器类型及浏览器语言因为浏览器在和服务器连接时候都会先发送一些包含自己信息的内容(浏览器类型、语言)。

这里我们主要分析的是_SERVER["HTTP_USER_AGENT"](浏览器类型)和_SERVER["HTTP_ACCEPT_LANGUAGE"](浏览器语言)。
我们所要做的就是把这些内容读出来,然后用strpos或者preg_match函数来对比就可以了。
判断浏览器类型:

 代码如下 复制代码

 <?php echo $_SERVER["HTTP_USER_AGENT"];?>

先给出PHP代码部分,有些不是很全,需要的朋友自己依葫芦画瓢自行添加去。(下面这个代码有个小错误,请将文章看完并自行修改)

 代码如下 复制代码

<?php
if(strpos($_SERVER["HTTP_USER_AGENT"],"MSIE 9.0"))
echo "Internet Explorer 9.0";
else if(strpos($_SERVER["HTTP_USER_AGENT"],"MSIE 8.0"))
echo "Internet Explorer 8.0";
else if(strpos($_SERVER["HTTP_USER_AGENT"],"MSIE 7.0"))
echo "Internet Explorer 7.0";
else if(strpos($_SERVER["HTTP_USER_AGENT"],"MSIE 6.0"))
echo "Internet Explorer 6.0";
else if(strpos($_SERVER["HTTP_USER_AGENT"],"Firefox"))
echo "Firefox";
else if(strpos($_SERVER["HTTP_USER_AGENT"],"Chrome"))
echo "Chrome";
else if(strpos($_SERVER["HTTP_USER_AGENT"],"Safari"))
echo "Safari";
else if(strpos($_SERVER["HTTP_USER_AGENT"],"Opera"))
echo "Opera";
else echo $_SERVER["HTTP_USER_AGENT"];
?>

打开opera浏览器,可以看到它的页面请求头信息如下:

Opera/9.80 (Windows NT 5.1; U; Edition IBIS; zh-cn) Presto/2.10.229 Version/11.61
但是 strpos($_SERVER["HTTP_USER_AGENT"],"Opera") 返回的值始终是“0”

解决方法比较也比较简单,

 代码如下 复制代码

else if(strpos($_SERVER["HTTP_USER_AGENT"],"Opera"))

替换成

else if(strpos($_SERVER["HTTP_USER_AGENT"],"pera"))

下面再补一个更强的可判断是浏览器用户还是seo/seo.html" target="_blank">搜索引擎

 代码如下 复制代码


function my_get_browser(){
 if(empty($_SERVER['HTTP_USER_AGENT'])){
  return '命令行,机器人来了!';
 }
 if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'MSIE 9.0')){
  return 'Internet Explorer 9.0';
 }
 if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'MSIE 8.0')){
  return 'Internet Explorer 8.0';
 }
 if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'MSIE 7.0')){
  return 'Internet Explorer 7.0';
 }
 if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'MSIE 6.0')){
  return 'Internet Explorer 6.0';
 }
 if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'Firefox')){
  return 'Firefox';
 }
 if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'Chrome')){
  return 'Chrome';
 }
 if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'Safari')){
  return 'Safari';
 }
 if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'Opera')){
  return 'Opera';
 }
 if(false!==strpos($_SERVER['HTTP_USER_AGENT'],'360SE')){
  return '360SE';
 }
}

[!--infotagslink--]

相关文章

  • 在java中获取List集合中最大的日期时间操作

    这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
  • 一个关于JS正则匹配的踩坑记录

    这篇文章主要给大家介绍了一个关于JS正则匹配的踩坑记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-13
  • 常用的日期时间正则表达式

    常用的日期时间正则表达式 下面收藏了大量的日期时间正则匹配函数,包括分钟,时间与秒都能达到。 正则表达式 (?n:^(?=d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(...2016-11-25
  • 非常全面的php日期时间运算汇总

    实例讲解之前,先来介绍几个核心函数: mktime 函数 mktime() 函数返回一个日期的 Unix 时间戳。 参数总是表示 GMT 日期,因此 is_dst 对结果没有影响。 参数可以从右到左依次空着,空着的参数会被设为相应的当前 GMT 值。...2015-11-08
  • PowerShell中使用Get-Date获取日期时间并格式化输出的例子

    这篇文章主要介绍了PowerShell中使用Get-Date获取日期时间并格式化输出的例子,本文讲解了直接调用Get-Date、在Write-Host中使用Get-Date、格式化输出的方法,需要的朋友可以参考下...2020-06-30
  • js正则学习小记之匹配字符串字面量

    关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配,因为我想学完之后写个语法高亮练手,所以用js代码当作例子...2021-05-07
  • JS基于正则截取替换特定字符之间字符串操作示例

    这篇文章主要介绍了JS基于正则截取替换特定字符之间字符串操作方法,结合具体实例形式分析了JS基于正则实现针对特殊字符、数字等字符串类型的截取操作相关技巧,需要的朋友可以参考下...2017-02-08
  • js 正则学习小记之匹配字符串字面量优化篇

    昨天在《js 正则学习小记之匹配字符串字面量》谈到 /"(?:\\.|[^"])*"/ 是个不错的表达式,因为可以满足我们的要求,所以这个表达式可用,但不一定是最好的...2021-05-07
  • C#使用正则表达式过滤html标签

    最近在开发一个项目,其中有需求要求我们把一段html转换为一般文本返回,使用正则表达式是明智的选择,下面小编给介绍下C#使用正则表达式过滤html标签,需要的朋友参考下...2020-06-25
  • 浅谈JS正则RegExp对象

    这篇文章主要介绍JS正则RegExp对象,正则表达式是描述字符模式的对象,用于对字符串模式匹配及检索替换,是对字符串执行模式匹配的强大工具。下面就来看具体详情,需要的朋友可以参考一下...2021-10-21
  • js显示当前日期时间和星期几

    JavaScript获取当前日期时间同时显示星期几,具体代码如下: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script type="text/javascript" src="/jquery/1.7.0/jquery.min.js...2015-10-23
  • OpenResty中正则模式匹配的2种方法详解

    在 OpenResty 中,同时存在两套正则表达式规范:Lua 语言的规范和 Nginx 的规范,下面这篇文章主要给大家介绍了关于OpenResty中正则模式匹配的2种方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。...2020-06-30
  • 浅谈js正则之test方法bug篇

    其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西...2021-05-07
  • JS利用正则配合replace替换指定字符

    替换指定字符的方法有很多,在本文为大家详细介绍下,JS利用正则配合replace是如何做到的,喜欢的朋友可以参考下...2021-05-07
  • C#中日期时间的简单操作

    这篇文章介绍了C#中日期时间的简单操作,有需要的朋友可以参考一下...2020-06-25
  • Spring-AOP 静态正则表达式方法如何匹配切面

    这篇文章主要介绍了Spring-AOP 静态正则表达式方法如何匹配切面的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-19
  • php正则中文表达式

    php教程正则中文表达式 $str = "abc一二三cde"; echo preg_replace('/[^x4e00-x9fa5]/i'," ",$str); $str = "php编程"; if (preg_match("/^[x4e00-x9fa5]+$/u",$s...2016-11-25
  • php正则入门 实习email和URL验证

    匹配email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 匹配网址url的正则表达式:[a-za-z]+://[^s]* 下面看一实例 <body onload="f.a.select();"> <?php...2016-11-25
  • PHP中日期时间函数date()用法总结

    date()是我们常用的一个日期时间函数,下面我来总结一下关于date()函数的各种形式的用法,有需要学习的朋友可参考。 格式化日期 date() 函数的第一个参数规定了如何...2016-11-25
  • PHP正则判断输入是否字母实例程序

    在php中判断是否为纯字母我们可直接使用正则/^[a-zA-Z]$/来验证了,包括大小写字母哦,有需要了解的同学可参考参考。 上代码 代码如下 复制代码 ...2016-11-25