200, "message" => $message, 'data' => $data]); } else { echo json_encode(["code" => 200, "message" => $message, 'data' => $data??'']); } die; } /** * 输出错误JSON * * @param string 错误信息 * @param int 错误代码 * @return json */ function jerr($message = 'error', $code = 500) { header("content-type:application/json;chartset=uft-8"); echo json_encode(["code" => $code, "message" => $message]); die; } /** * 密码+盐 加密 * * @param string 明文密码 * @param string 盐 * @return string */ function encodePassword($password, $salt) { return sha1($password . $salt . $password . $salt); } /** * 密码校验 6-16 * * @param string 明文密码 * @return boolean 是否校验通过 */ function isValidPassword($password) { return preg_match('/(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?!.*\s).{6,}/', $password); } /** * 获取随机字符 * * @param int $len * @return void */ function getRandString($len) { $string = ''; $randString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; for ($i = 0; $i < $len; $i++) { $string .= $randString[rand(0, strlen($randString) - 1)]; } return $string; } /** * 生成唯一会议编码 * @param string $prefix 头部 * @return string */ function get_order_no($prefix = 'QF') { $order_no = $prefix; $order_no .= mb_strtoupper(dechex(date('m')), 'utf-8'); $order_no .= date('d') . mb_substr(time(), -5, null, 'utf-8'); $order_no .= mb_substr(microtime(), 2, 5, 'utf-8'); return $order_no; } /** * 获取随机字母 * * @param int 长度 * @return string */ function getRandChar($len) { $string = ''; $randString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; for ($i = 0; $i < $len; $i++) { $string .= $randString[rand(0, strlen($randString) - 1)]; } return $string; } /** * 驼峰转下划线 * @param $camelCaps * @param string $separator * @return string */ function uncamelize($camelCaps, $separator = '_') { return strtolower(preg_replace('/([a-z])([A-Z])/', "$1" . $separator . "$2", $camelCaps)); } /** * 遍历类的方法 * * @param string 指定的类名称 * @return array */ function getClassMethods($class) { $array_result = []; $array_all = get_class_methods($class); if ($parent_class = get_parent_class($class)) { $array_parent = get_class_methods($parent_class); $array_result = array_diff($array_all, $array_parent); } else { $array_result = $array_all; } return $array_result; } /** * 获取包含协议和端口的域名 * * @return string */ function getFullDomain() { // return ($_SERVER['HTTP_X_FORWARDED_PROTO'] ?? $_SERVER['REQUEST_SCHEME']) . "://" . $_SERVER['HTTP_HOST']; return "http://" . $_SERVER['HTTP_HOST']; } /** * 图片地址转绝对路径 * * @return string */ function getimgurl($img) { $result = ''; if($img){ // $url = ($_SERVER['HTTP_X_FORWARDED_PROTO'] ?? $_SERVER['REQUEST_SCHEME']) . "://" . $_SERVER['HTTP_HOST']; $url = "http://" . $_SERVER['HTTP_HOST']; if(is_array($img)){ $result = []; foreach ($img as $key => $value) { if(!preg_match("/^http(s)?:\\/\\/.+/", $value)){ $result[] = $url.$value; }else{ $result[] = $value; } } }else{ if(!preg_match("/^http(s)?:\\/\\/.+/", $img)){ $result = $url.$img; }else{ $result = $img; } } } return $result; } /** * 替换编辑器内容中的文件地址 * @param string $content 编辑器内容 * @return string */ function app_replace_content_file_url($content) { \phpQuery::newDocumentHTML($content); $pq = pq(null); $domain = request()->host(); $images = $pq->find("img"); if ($images->length) { foreach ($images as $img) { $img = pq($img); $imgSrc = $img->attr("src"); if(!preg_match("/^http(s)?:\\/\\/.+/", $imgSrc)){ $img->attr("src", getimgurl($imgSrc)); } } } $links = $pq->find("a"); if ($links->length) { foreach ($links as $link) { $link = pq($link); $href = $link->attr("href"); if(!preg_match("/^http(s)?:\\/\\/.+/", $href)){ $img->attr("href", getimgurl($imgSrc)); } } } $content = $pq->htmlOuter(); \phpQuery::$documents = null; return $content; } /** * 获取客户端IP * * @return string */ function getClientIp() { foreach (array( 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR' ) as $key) { if (array_key_exists($key, $_SERVER)) { foreach (explode(',', $_SERVER[$key]) as $ip) { $ip = trim($ip); if ((bool) filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6 // FILTER_FLAG_NO_PRIV_RANGE | // FILTER_FLAG_NO_RES_RANGE )) { return $ip; } } } } return null; } /** * 取文本中间 * * @param string 原始字符串 * @param string 左边字符串 * @param string 右边字符串 * @return string */ function getSubstr($str, $leftStr, $rightStr) { $left = strpos($str, $leftStr); $right = strpos($str, $rightStr, $left); if ($left < 0 or $right < $left) return ''; return substr($str, $left + strlen($leftStr), $right - $left - strlen($leftStr)); } /** * 获取操作系统 * * @return string */ function getOs() { if (empty($_SERVER['HTTP_USER_AGENT'])) { return 'Other'; } $agent = strtolower($_SERVER['HTTP_USER_AGENT']); if (strpos($agent, 'windows nt')) { $platform = 'Windows'; } elseif (strpos($agent, 'macintosh')) { $platform = 'MacOS'; } elseif (strpos($agent, 'ipod')) { $platform = 'iPod'; } elseif (strpos($agent, 'ipad')) { $platform = 'iPad'; } elseif (strpos($agent, 'iphone')) { $platform = 'iPhone'; } elseif (strpos($agent, 'android')) { $platform = 'Android'; } elseif (strpos($agent, 'unix')) { $platform = 'Unix'; } elseif (strpos($agent, 'linux')) { $platform = 'Linux'; } else { $platform = 'Other'; } return $platform; } /** * 获取浏览器 * * @return void */ function getBrowser() { if (empty($_SERVER['HTTP_USER_AGENT'])) { return 'Unknown'; } $agent = $_SERVER["HTTP_USER_AGENT"]; if (strpos($agent, 'MSIE') !== false || strpos($agent, 'rv:11.0')) //ie11判断 { return "IE"; } else if (strpos($agent, 'Firefox') !== false) { return "Firefox"; } else if (strpos($agent, 'Chrome') !== false) { return "Chrome"; } else if (strpos($agent, 'Opera') !== false) { return 'Opera'; } else if ((strpos($agent, 'Chrome') == false) && strpos($agent, 'Safari') !== false) { return 'Safari'; } else { return 'Unknown'; } } /** * 是否手机请求 * * @return boolean */ function isMobileRequest() { $_SERVER['ALL_HTTP'] = isset($_SERVER['ALL_HTTP']) ? $_SERVER['ALL_HTTP'] : ''; $mobile_browser = '0'; if (preg_match('/(up.browser|up.link|mmp|symbian|smartphone|midp|wap|phone|iphone|uc|qq|wechat|micro|messenger|ipad|ipod|android|xoom)/i', strtolower($_SERVER['HTTP_USER_AGENT']))) $mobile_browser++; if ((isset($_SERVER['HTTP_ACCEPT'])) and (strpos(strtolower($_SERVER['HTTP_ACCEPT']), 'application/vnd.wap.xhtml+xml') !== false)) $mobile_browser++; if (isset($_SERVER['HTTP_X_WAP_PROFILE'])) $mobile_browser++; if (isset($_SERVER['HTTP_PROFILE'])) $mobile_browser++; $mobile_ua = strtolower(substr($_SERVER['HTTP_USER_AGENT'], 0, 4)); $mobile_agents = array( 'w3c ', 'acs-', 'alav', 'alca', 'amoi', 'audi', 'avan', 'benq', 'bird', 'blac', 'blaz', 'brew', 'cell', 'cldc', 'cmd-', 'dang', 'doco', 'eric', 'hipt', 'inno', 'ipaq', 'java', 'jigs', 'kddi', 'keji', 'leno', 'lg-c', 'lg-d', 'lg-g', 'lge-', 'maui', 'maxo', 'midp', 'mits', 'mmef', 'mobi', 'mot-', 'moto', 'mwbp', 'nec-', 'newt', 'noki', 'oper', 'palm', 'pana', 'pant', 'phil', 'play', 'port', 'prox', 'qwap', 'sage', 'sams', 'sany', 'sch-', 'sec-', 'send', 'seri', 'sgh-', 'shar', 'sie-', 'siem', 'smal', 'smar', 'sony', 'sph-', 'symb', 't-mo', 'teli', 'tim-', 'tosh', 'tsm-', 'upg1', 'upsi', 'vk-v', 'voda', 'wap-', 'wapa', 'wapi', 'wapp', 'wapr', 'webc', 'winw', 'winw', 'xda', 'xda-' ); if (in_array($mobile_ua, $mobile_agents)) $mobile_browser++; if (strpos(strtolower($_SERVER['ALL_HTTP']), 'operamini') !== false) $mobile_browser++; // Pre-final check to reset everything if the user is on Windows if (strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'windows') !== false) $mobile_browser = 0; // But WP7 is also Windows, with a slightly different characteristic if (strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'windows phone') !== false) $mobile_browser++; if ($mobile_browser > 0) return true; else return false; } /** * 身份证号验证 * @param $id * @return bool */ function isIDCard($id) { $id = strtoupper($id); $regx = "/(^\d{15}$)|(^\d{17}([0-9]|X)$)/"; $arr_split = array(); if (!preg_match($regx, $id)) { return FALSE; } if (15 == strlen($id)) //检查15位 { $regx = "/^(\d{6})+(\d{2})+(\d{2})+(\d{2})+(\d{3})$/"; @preg_match($regx, $id, $arr_split); //检查生日日期是否正确 $dtm_birth = "19" . $arr_split[2] . '/' . $arr_split[3] . '/' . $arr_split[4]; if (!strtotime($dtm_birth)) { return FALSE; } else { return TRUE; } } else { //检查18位 $regx = "/^(\d{6})+(\d{4})+(\d{2})+(\d{2})+(\d{3})([0-9]|X)$/"; @preg_match($regx, $id, $arr_split); $dtm_birth = $arr_split[2] . '/' . $arr_split[3] . '/' . $arr_split[4]; if (!strtotime($dtm_birth)) //检查生日日期是否正确 { return FALSE; } else { //检验18位身份证的校验码是否正确。 //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 $arr_int = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); $arr_ch = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); $sign = 0; for ($i = 0; $i < 17; $i++) { $b = (int) $id[$i]; $w = $arr_int[$i]; $sign += $b * $w; } $n = $sign % 11; $val_num = $arr_ch[$n]; if ($val_num != substr($id, 17, 1)) { return FALSE; } else { return TRUE; } } } } /** * 是否是整数 * * @param string 输入内容 * @return boolean */ function isInteger($input) { return (ctype_digit(strval($input))); } /** * 获取一个key摘要 * * @param string 原始key * @return string */ function getTicket($key) { return sha1($key . (env('SYSTEM_SALT') ?? 'qfshop') . $key); } /** * 通用CURL请求函数 * * @param string $url URL地址 * @param string $method 请求方法, 支持GET/POST/PUT/DELETE/PATCH/TRACE/OPTIONS/HEAD 默认POST * @param mixed $data 请求数据包体 * @param array $header 请求头 数组 * @param array $queryParams 查询参数 数组 * @param string $cookies 请求COOKIES字符串 * @param int $timeout 请求超时时间,默认30秒 * @return array 响应数组,包括header, body, detail, error */ function curlHelper($url, $method = 'POST', $data = null, $header = [], $queryParams = "", $cookies = "", $timeout = 60) { // 构建查询参数 if (!empty($queryParams)) { $queryString = http_build_query($queryParams); $url .= '?' . $queryString; } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_COOKIE, $cookies); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); // 设置超时时间 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); // 设置连接超时时间 // 根据请求方法设置选项 switch (strtoupper($method)) { case "POST": curl_setopt($ch, CURLOPT_POST, true); if ($data) { curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } break; case "PUT": case "DELETE": case "PATCH": case "TRACE": case "OPTIONS": case "HEAD": curl_setopt($ch, CURLOPT_CUSTOMREQUEST, strtoupper($method)); if ($data) { curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } break; case "GET": default: curl_setopt($ch, CURLOPT_HTTPGET, true); break; } $response = curl_exec($ch); if ($response === false) { $error = curl_error($ch); curl_close($ch); return ['error' => $error]; } $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE); $output = [ 'header' => substr($response, 0, $headerSize), 'body' => substr($response, $headerSize), 'detail' => curl_getinfo($ch) ]; curl_close($ch); return $output; } /** * 模拟表单上传文件请求 * @param $$url 提交地址 * @param $data 提交数据 * @param $cookies 如设置了Content-Type将被自动覆写为formdata * ex. * $data = ['file'=>new \CURLFile(realpath($file_dir)),appid"=>"1234"]; * $result = curl_form($url,$data); * @return mixed */ function curlForm($url, $data = null, $header = [], $cookies = "") { $header[] = 'Content-Type: multipart/form-data'; return curlHelper($url, "POST", $data, $header, $cookies); } /** * 多维数组合并(支持多数组) * @param arraylist arrayMergeMulti(['1'=>'1','2'=>'2','3'=>'3'],['4'=>'4','5'=>'5','6'=>'6']) * @return array */ function arrayMergeMulti() { //获取当前方法捕获到的所有参数数组 $args = func_get_args(); $array = []; foreach ($args as $arg) { if (is_array($arg)) { foreach ($arg as $k => $v) { if (is_array($v)) { $array[$k] = isset($array[$k]) ? $array[$k] : []; $array[$k] = arrayMergeMulti($array[$k], $v); } else { $array[$k] = $v; } } } } return $array; } /** * 对查询结果集进行排序 * @access public * @param array $list 查询结果 * @param string $field 排序的字段名 * @param array $sortBy 排序类型 * asc正向排序 desc逆向排序 nat自然排序 * @return array|bool */ function listSortBy($list, $field, $sortBy = 'asc') { if (is_array($list)) { $refer = $resultSet = []; foreach ($list as $i => $data) { $refer[$i] = &$data[$field]; } switch ($sortBy) { case 'asc': // 正向排序 asort($refer); break; case 'desc': // 逆向排序 arsort($refer); break; case 'nat': // 自然排序 natcasesort($refer); break; } foreach ($refer as $key => $val) { $resultSet[] = &$list[$key]; } return $resultSet; } return false; } /** * 格式化字节大小 * @param number $size 字节数 * @param int $float 小数保留位数 * @param string $delimiter 数字和单位分隔符 * @return string 格式化后的带单位的大小 */ function formatBytes($size, $float = 2, $delimiter = '') { $units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']; for ($i = 0; $size >= 1024 && $i < 5; $i++) $size /= 1024; return round($size, $float) . $delimiter . $units[$i]; } /** * 生成标准UUID * * @return string */ function getUuid() { mt_srand((float) microtime() * 10000); $uuid = sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535)); return $uuid; } /** * 判断是否为空参数 * @param mixed $parm * @return bool */ function is_empty_parm(&$parm) { return !(isset($parm) && '' !== $parm); } /** * 返回当前账号openid * $openid wxapp_openid wechat_openid * @return string */ function get_client_openid($user_id, $openid) { return \think\facade\Db::name('user')->where('user_id', $user_id)->value($openid); } /** * 产生数字与字母混合随机字符串 * @param int $len 数值长度,默认6位 * @return string */ function get_randstr($len = 6) { $chars = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ]; $charsLen = count($chars) - 1; shuffle($chars); $output = ''; for ($i = 0; $i < $len; $i++) { $output .= $chars[mt_rand(0, $charsLen)]; } return $output; } /** * 产生随机数值 * @param int $len 数值长度,默认8位 * @return string */ function rand_number($len = 8) { $chars = str_repeat('123456789', 3); if ($len > 10) { $chars = str_repeat($chars, $len); } $chars = str_shuffle($chars); return mb_substr($chars, 0, $len, 'utf-8'); } /** * 智能字符串模糊化 * @param string $str 被模糊的字符串 * @param int $len 模糊的长度 * @return string */ function auto_hid_substr(string $str, $len = 3) { if (empty($str)) { return null; } $sub_str = mb_substr($str, 0, 1, 'utf-8'); for ($i = 0; $i < $len; $i++) { $sub_str .= '*'; } if (mb_strlen($str, 'utf-8') <= 2) { $str = $sub_str; } $sub_str .= mb_substr($str, -1, 1, 'utf-8'); return $sub_str; } /** * 多维数组,根据某个特定字段过滤重复值 * @return array */ function assoc_unique($arr, $key) { $tmp_arr = array(); foreach ($arr as $k => $v) { if (in_array($v[$key], $tmp_arr)) {//搜索$v[$key]是否在$tmp_arr数组中存在,若存在返回true unset($arr[$k]); } else { $tmp_arr[] = $v[$key]; } } sort($arr); //sort函数对数组进行排序 return $arr; } function getDom($url) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $html = curl_exec($ch); curl_close($ch); $dom = new DOMDocument(); @$dom->loadHTML($html); return $dom; } /** * 过滤标点符号并提取词语 * * @param array $result 分词结果 * @return array 过滤后的词汇 */ function filterAndExtractWords(array $result) { // 定义要过滤掉的符号,包括标点符号和其他符号 $pattern = '/[\p{P}\p{S}]/u'; // 提取词语、过滤掉符号并删除空的词语 $filteredWords = array(); foreach ($result as $item) { $word = preg_replace($pattern, '', $item[0]); // 只保留非空的词汇 if (!empty($word)) { $filteredWords[] = $word; } } return $filteredWords; } /** * 高亮显示关键词 * @param string $title 原始标题 * @param string $searchTitle 搜索标题 * @return string 带有高亮的标题 */ function highlightKeywords($title, $searchTitle) { $originalTitle = $title; // 保存原始标题 // 使用正则表达式来高亮所有关键词 foreach ($searchTitle as $keyword) { $title = preg_replace('/(' . preg_quote($keyword, '/') . ')/i', '$1', $title); } // 如果有关键词被高亮,添加
标签 if ($title !== $originalTitle) { $title = '
' . $title . '
'; } return $title; } /** * 判断是哪个网盘 * @return array */ function determineIsType($url) { // 判断 $url 中包含的域名并返回对应的 is_type if (strpos($url, 'alipan.com') !== false) { return 1; } elseif (strpos($url, 'baidu.com') !== false) { return 2; } elseif (strpos($url, 'uc.cn') !== false) { return 3; } elseif (strpos($url, 'xunlei.com') !== false) { return 4; } else { // 默认值是夸克网盘,返回 0 return 0; } }