今晚在写框架的表单验证类时,需要判断某个字符串长度是否在指定区间内,很自然地,想到了PHP中的strlen函数。
代码如下 | 复制代码 |
|
测试一下中文
代码如下 | 复制代码 |
$str = '你好,世界!'; |
PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得 到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍的差异了(在 UTF-8编码下,一个汉字占3个字节)。
下面这个实例摘自大名鼎鼎的WordPress,非常精确的哦,另外需要注意的是本函数仅适用于utf-8 编码下的字符串。
代码如下 | 复制代码 |
|
但以上代码在UTF-8编码下并不能处理GBK/GB2312的中文字符串,因为GBK/GB2312的中文字符会被识别为两个字符而计算出来的中文字符数量会翻倍,于是我想到了这么一个办法:
代码如下 | 复制代码 |
$tmp = @iconv('gbk', 'utf-8', $str); |
可兼容GBK/GB2312及UTF-8编码,经小量数据测试通过,但暂未确定是否完全正确
数据编码转换方法不能直接使用iconv函数来进行转换了,但我们可以利用iconv与var_export函数进行编码转换了,下面来看一个实例
用构建数组原型的序列化方法,借助var_export函数,最终函数如下:
代码如下 | 复制代码 |
function array_iconv($in_charset,$out_charset,$arr){ return eval('return '.iconv($in_charset,$out_charset,var_export($arr,true).';')); } |
原理很简单 var_export设置第二个参数为true,返回数组原型字符串,将字符串转换为utf-8编码,之后再用eval来执行返回(类似匿名函数?),至此完美解决问题。
一聚教程小编还有一个想法,就是利用foreach遍历数组然后再利用iocnv函数起先一个个转换了,不过这样转换的是把数组值进行转换了。
我们只要知道身份证的生成规则就可以了,像下面我们从指定位置到多少位就是出日期了,然后我们把日期转成时间戳然后进行加减运算就得出了年龄了,下面我们看实例。代码如下 | 复制代码 |
<?php function getAgeByID($id){ //过了这年的生日才算多了1周岁 if(empty($id)) return ''; $date=strtotime(substr($id,6,8)); //获得出生年月日的时间戳 $today=strtotime('today'); //获得今日的时间戳 $diff=floor(($today-$date)/86400/365); //得到两个日期相差的大体年数 //strtotime加上这个年数后得到那日的时间戳后与今日的时间戳相比 $age=strtotime(substr($id,6,8).' +'.$diff.'years')>$today?($diff+1):$diff; return $age; } ?> |
代码如下 | 复制代码 |
$file_path = '123.txt'; |
昨天帮客户修改完侧边栏,以为终于可以透一口气了,结果临下班的时候,他居然又发消息过来,说需要在每篇文章下边加一个标签,随机显示他们公司的12个业务的广告词。确定了需求,那就动手吧。
其实蛮简单的,先预定义一个数组存储这12个广告词,如
代码如下 | 复制代码 |
$option = array('广www.111cn.net词1','广告词2','广告词3','广告词4','广告词5'); |
然后随机生成一个下标,
代码如下 | 复制代码 |
$index = rand(0, count($option)-1); |
一般情况下,为了扩展方便,最好是将这个数据存入数据库或者xml,不过思路是一样的。
除了上面办法我们可以使用array_rand() 函数,此函数数组中随机选出一个或多个元素,并返回。
例子 1
代码如下 | 复制代码 |
<?php |
输出:
b