1. PHP 技巧
1.1. preg_match、preg_match_all 长度限制
解决方法: 1、ini_set('pcre.backtrack_limit', 100000000); //默认的只有100000 2、修改 php.ini 的pcre.backtrack_limit参数,使之支持更大的字符串。加入配置:pcre.backtrack_limit=-1
1.2. 常用的一些方法
1.2.1. 生成随机字符串
/**
* 生成随机字符串
* @param int $length 要生成的随机字符串长度
* @param string $type 随机码类型:0,数字+大小写字母;1,数字;2,小写字母;3,大写字母;4,特殊字符;-1,数字+大小写字母+特殊字符
* @return string
*/
public static function randCode($length = 7, $type = 0) {
$arr = array(1 => "0123456789", 2 => "abcdefghijklmnopqrstuvwxyz", 3 => "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 4 => "~@#$%^&*(){}[]|");
if ($type == 0) {
array_pop($arr);
$string = implode("", $arr);
} elseif ($type == "-1") {
$string = implode("", $arr);
} else {
$string = $arr[$type];
}
$count = strlen($string) - 1;
$code = '';
for ($i = 0; $i < $length; $i++) {
$code .= $string[rand(0, $count)];
}
return $code;
}
1.2.2. 生成随机字符串
public static function randomstring() {
$str="abcdefghijkmnpqrstuvwxyz0123456789ABCDEFGHIGKLMNPQRSTUVWXYZ";//设置被随机采集的字符串
$codeLen='18';//设置生成的随机数个数
function str_rand($str,$codeLen){
$rand="";
for($i=0; $i<$codeLen-1; $i++){
$rand .= $str[mt_rand(0, strlen($str)-1)]; //如:随机数为30 则:$str[30]
}
return $rand;
}
$code=str_rand($str,$codeLen);
return $code;
}
1.2.3. 验证手机号是否正确
/**
* 验证手机号是否正确
* @param INT $mobile
*/
public static function isMobile($mobile) {
if (!is_numeric($mobile)) {
return false;
}
return preg_match('#^13[\d]{9}$|^14[5,7]{1}\d{8}$|^15[^4]{1}\d{8}$|^17[0,6,7,8]{1}\d{8}$|^18[\d]{9}$#', $mobile) ? true : false;
}
1.2.4. 截取中文字符串
/**
* 截取中文字符串
* @param $text
* @param $length
* @return string
*/
public static function subtext($text, $length)
{
if(mb_strlen($text, 'utf8') > $length)
return mb_substr($text, 0, $length, 'utf8').'...';
return $text;
}
1.2.5. 格式化显示时间
public static function getLastTimeFormt($time,$type=0){
if($type==0) $f="m-d H:i";
else if($type==1) $f="Y-m-d H:i";
$agoTime = time() - $time;
if ( $agoTime <= 60&&$agoTime >=0 ) {
return $agoTime.'秒前';
}elseif( $agoTime <= 3600 && $agoTime > 60 ){
return intval($agoTime/60) .'分钟前';
}elseif( $agoTime <= 86400 && $agoTime > 3600 ){
return intval($agoTime/3600) .'小时前';
}elseif( $agoTime <= 604800 && $agoTime > 86400 ){
return intval($agoTime/86400) .'天前';
}else{
return '一周前';
}
}
public static function getCycleTime($timestart,$timeover){
$timeCycle = $timeover - $timestart;
if($timeCycle < 3600 && $timeCycle >= 0){
return intval($timeCycle/60) .'分钟';
}elseif($timeCycle > 3600 && $timeCycle < 86400){
return intval($timeCycle/3600) .'小时';
}else{
return intval($timeCycle/86400) .'天';
}
}
1.2.6. 获取客户端ip
/**
* 获取客户端ip
*
* @return string 客户端ip字符串,xxx.xxx.xxx.xxx格式
*/
public static function getClientIp() {
$unknown = 'unknown';
if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] && strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], $unknown)) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], $unknown)) {
$ip = $_SERVER['REMOTE_ADDR'];
}
//处理多层代理的情况,或者使用正则方式:$ip = preg_match("/[\d\.]{7,15}/", $ip, $matches) ? $matches[0] : $unknown;
if (false !== strpos($ip, ',')) {
$ip = reset(explode(',', $ip));
}
return $ip;
}
1.2.7. PHP stdClass Object转array
public static function object_array($array) {
if(is_object($array)) {
$array = (array)$array;
} if(is_array($array)) {
foreach($array as $key=>$value) {
$array[$key] = self::object_array($value);
}
}
return $array;
}
1.2.8. 生产唯一通行编码
public static function uuids($prefix=''){
$str = md5(uniqid(mt_rand(), true));
$uuid = substr($str,0,8) . '-';
$uuid .= substr($str,8,4) . '-';
$uuid .= substr($str,12,4) . '-';
$uuid .= substr($str,16,4) . '-';
$uuid .= substr($str,20,12);
return $prefix . $uuid;
}
1.2.9. 验证身份证号
/**
* 验证身份证号
* @param $vStr
* @return bool
*/
public static function isCreditNo($vStr)
{
$vCity = array(
'11','12','13','14','15','21','22',
'23','31','32','33','34','35','36',
'37','41','42','43','44','45','46',
'50','51','52','53','54','61','62',
'63','64','65','71','81','82','91'
);
if (!preg_match('/^([\d]{17}[xX\d]|[\d]{15})$/', $vStr)) return false;
if (!in_array(substr($vStr, 0, 2), $vCity)) return false;
$vStr = preg_replace('/[xX]$/i', 'a', $vStr);
$vLength = strlen($vStr);
if ($vLength == 18)
{
$vBirthday = substr($vStr, 6, 4) . '-' . substr($vStr, 10, 2) . '-' . substr($vStr, 12, 2);
} else {
$vBirthday = '19' . substr($vStr, 6, 2) . '-' . substr($vStr, 8, 2) . '-' . substr($vStr, 10, 2);
}
if (date('Y-m-d', strtotime($vBirthday)) != $vBirthday) return false;
if ($vLength == 18)
{
$vSum = 0;
for ($i = 17 ; $i >= 0 ; $i--)
{
$vSubStr = substr($vStr, 17 - $i, 1);
$vSum += (pow(2, $i) % 11) * (($vSubStr == 'a') ? 10 : intval($vSubStr , 11));
}
if($vSum % 11 != 1) return false;
}
return true;
}
1.2.10. 移除Html代码中的XSS攻击
public static function remove_xss($val) {
$val = preg_replace('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/', '', $val);
$search = 'abcdefghijklmnopqrstuvwxyz';
$search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$search .= '1234567890!@#$%^&*()';
$search .= '~`";:?+/={}[]-_|\'\\';
for ($i = 0; $i < strlen($search); $i++) {
$val = preg_replace('/(&#[xX]0{0,8}' . dechex(ord($search[$i])) . ';?)/i', $search[$i], $val);
$val = preg_replace('/(�{0,8}' . ord($search[$i]) . ';?)/', $search[$i], $val);
}
$ra1 = array('expression', 'applet', 'meta','script','xml', 'blink', 'link', 'style', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base');
$ra2 = array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload');
$ra = array_merge($ra1, $ra2);
$found = true;
while ($found == true) {
$val_before = $val;
for ($i = 0; $i < sizeof($ra); $i++) {
$pattern = '/';
for ($j = 0; $j < strlen($ra[$i]); $j++) {
if ($j > 0) {
$pattern .= '(';
$pattern .= '(&#[xX]0{0,8}([9ab]);)';
$pattern .= '|';
$pattern .= '|(�{0,8}([9|10|13]);)';
$pattern .= ')*';
}
$pattern .= $ra[$i][$j];
}
$pattern .= '/i';
$replacement = substr($ra[$i], 0, 2) . '<x>' . substr($ra[$i], 2);
$val = preg_replace($pattern, $replacement, $val);
if ($val_before == $val) {
$found = false;
}
}
}
return $val;
}
1.2.11. 获取固定长度数字
public static function generate_code($length = 6) {
$min = pow(10 , ($length - 1));
$max = pow(10, $length) - 1;
return rand($min, $max);
}
1.2.12. 判断是否是json
public static function is_json($string) {
@json_decode($string);
return (json_last_error() == JSON_ERROR_NONE);
}
1.2.13. 生成订单号
public static function create_order_code(){
list ( $usec, $sec ) = explode ( " ", microtime () );
$usec = substr ( str_replace ( '0.', '', $usec ), 0, 4 );
$str = rand ( 10, 99 );
return date ( "YmdHis" ) . $usec . $str;
}
1.2.14. Curl
public static function curlGet($url) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_ENCODING, "");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($curl);
curl_close($curl);
return $result;
}
// curl post
public static function curlPost($url,$data)
{
$curl = curl_init(); // 启动一个CURL会话
curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
//curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
if(isset($_SERVER['HTTP_USER_AGENT'])){
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
}
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
$tmpInfo = curl_exec($curl); // 执行操作
if (curl_errno($curl)) {
echo 'Errno'.curl_error($curl);//捕抓异常
}
curl_close($curl); // 关闭CURL会话
return $tmpInfo; // 返回数据
}
1.2.15. xml 转 array
public static function xml_to_json($source,$flag=FALSE) {
if(is_file($source)){ //传的是文件,还是xml的string的判断
$xml_array=simplexml_load_file($source);
}else{
$xml_array=simplexml_load_string($source);
}
if($flag)
{
return $xml_array;
}
$json = json_encode($xml_array); //php5,以及以上,如果是更早版本,请查看JSON.php
return $json;
}
1.2.16. 只保留字符串首尾字符,隐藏中间用*代替
/**
* @param string $user_name 姓名
* @return string 格式化后的姓名
*/
public static function substr_cut($user_name){
$strlen = mb_strlen($user_name, 'utf-8');
$firstStr = mb_substr($user_name, 0, 1, 'utf-8');
$lastStr = mb_substr($user_name, -1, 1, 'utf-8');
return $strlen == 2 ? $firstStr . str_repeat('*', mb_strlen($user_name, 'utf-8') - 1) : $firstStr . str_repeat("*", $strlen - 2) . $lastStr;
}
1.2.17. 转换时间差
public static function timediff($begin_time,$end_time,$diff=0,$type=0)
{
if(empty($diff)){
if($begin_time < $end_time){
$starttime = $begin_time;
$endtime = $end_time;
}else{
$starttime = $end_time;
$endtime = $begin_time;
}
//计算天数
$timediff = $endtime-$starttime;
}else{
$timediff = $diff;
}
$days = intval($timediff/86400);
//计算小时数
$remain = $timediff%86400;
$hours = intval($remain/3600);
//计算分钟数
$remain = $remain%3600;
$mins = intval($remain/60);
//计算秒数
$secs = $remain%60;
$res = array("day" => $days,"hour" => $hours,"min" => $mins,"sec" => $secs);
if($type){
if(intval($timediff/86400) == 0)
{
return [false,$res];
}
return [true,intval($timediff/86400)]; //天
}
return $res;
}
1.2.18. 二维码数组排序
public static function arrays_sort_by_item($arr,$direction='SORT_DESC',$field='id')
{
$sort = array(
'direction' => $direction, //排序顺序标志 SORT_DESC 降序;SORT_ASC 升序
'field' => $field, //排序字段
);
$arrSort = array();
foreach($arr AS $uniqid => $row){
foreach($row AS $key=>$value){
$arrSort[$key][$uniqid] = $value;
}
}
if($sort['direction']){
array_multisort($arrSort[$sort['field']], constant($sort['direction']), $arr);
}
return $arr;
}
1.2.19. 验证密码规则
/**
* 必须且只含有数字和字母,不小于6位
* @param $passwd
* @return int
*/
public static function checkPasswd($passwd)
{
return preg_match('/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,}$/', $passwd);
}
1.2.20. 判断是否是时间格式
/**
* @param $dateTime
* @return bool
*/
public static function isDateTime($dateTime){
$ret = strtotime($dateTime);
return $ret !== FALSE && $ret != -1;
}
1.2.21. 将数字转成汉字对应的月份
public static function str_to_month($str1)
{
$str_n = null;
switch($str1)
{
case 1:$str_n="一月";break;
case 2: $str_n="二月";break;
case 3:$str_n="三月";break;
case 4:$str_n="四月";break;
case 5:$str_n="五月";break;
case 6:$str_n="六月"; break;
case 7:$str_n="七月";break;
case 8:$str_n="八月";break;
case 9:$str_n="九月";break;
case 10:$str_n="十月";break;
case 11:$str_n="十一月";break;
case 12:$str_n="十二月";break;
}
return $str_n;
}