im/extend/utils/Str.php

594 lines
17 KiB
PHP
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/* file: 字符串处理类
Created by wanghong<1204772286@qq.com>
Date: 2021-02-22 */
namespace utils;
class Str{
protected static $snakeCache = [];
protected static $camelCache = [];
protected static $studlyCache = [];
/**
* 检查字符串中是否包含某些字符串
* @param string $haystack
* @param string|array $needles
* @return bool
*/
public static function contains($haystack, $needles)
{
foreach ((array) $needles as $needle) {
if ($needle != '' && mb_strpos($haystack, $needle) !== false) {
return true;
}
}
return false;
}
/**
* 检查字符串是否以某些字符串结尾
*
* @param string $haystack
* @param string|array $needles
* @return bool
*/
public static function endsWith($haystack, $needles)
{
foreach ((array) $needles as $needle) {
if ((string) $needle === static::substr($haystack, -static::length($needle))) {
return true;
}
}
return false;
}
/**
* 检查字符串是否以某些字符串开头
*
* @param string $haystack
* @param string|array $needles
* @return bool
*/
public static function startsWith($haystack, $needles)
{
foreach ((array) $needles as $needle) {
if ($needle != '' && mb_strpos($haystack, $needle) === 0) {
return true;
}
}
return false;
}
/**
* 获取指定长度的随机字母数字组合的字符串
*
* @param int $length
* @return string
*/
public static function random($length = 16)
{
$pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
return static::substr(str_shuffle(str_repeat($pool, $length)), 0, $length);
}
/**
* 字符串转小写
*
* @param string $value
* @return string
*/
public static function lower($value)
{
return mb_strtolower($value, 'UTF-8');
}
/**
* 字符串转大写
*
* @param string $value
* @return string
*/
public static function upper($value)
{
return mb_strtoupper($value, 'UTF-8');
}
/**
* 获取字符串的长度
*
* @param string $value
* @return int
*/
public static function length($value)
{
return mb_strlen($value);
}
/**
* 截取字符串
*
* @param string $string
* @param int $start
* @param int|null $length
* @return string
*/
public static function substr($string, $start, $length = null)
{
return mb_substr($string, $start, $length, 'UTF-8');
}
/**
* 驼峰转下划线
*
* @param string $value
* @param string $delimiter
* @return string
*/
public static function snake($value, $delimiter = '_')
{
$key = $value;
if (isset(static::$snakeCache[$key][$delimiter])) {
return static::$snakeCache[$key][$delimiter];
}
if (!ctype_lower($value)) {
$value = preg_replace('/\s+/u', '', $value);
$value = static::lower(preg_replace('/(.)(?=[A-Z])/u', '$1' . $delimiter, $value));
}
return static::$snakeCache[$key][$delimiter] = $value;
}
/**
* 下划线转驼峰(首字母小写)
*
* @param string $value
* @return string
*/
public static function camel($value)
{
if (isset(static::$camelCache[$value])) {
return static::$camelCache[$value];
}
return static::$camelCache[$value] = lcfirst(static::studly($value));
}
/**
* 下划线转驼峰(首字母大写)
*
* @param string $value
* @return string
*/
public static function studly($value)
{
$key = $value;
if (isset(static::$studlyCache[$key])) {
return static::$studlyCache[$key];
}
$value = ucwords(str_replace(['-', '_'], ' ', $value));
return static::$studlyCache[$key] = str_replace(' ', '', $value);
}
/**
* 转为首字母大写的标题格式
*
* @param string $value
* @return string
*/
public static function title($value)
{
return mb_convert_case($value, MB_CASE_TITLE, 'UTF-8');
}
/*
在数组中取想要的值
$array -array 被取值的数组
$field -string 所取的字段
$is_str -boolean 返回字符串(默认)或数组
return string
*/
public static function array_to_string($array,$field,$is_str=true){
$arr=[];
foreach($array as $k => $v){
if($v[$field]){
$arr[]=$v[$field];
}
}
//$idArr = array_unique($idArr);
if($is_str){
return implode(',',$arr);
}else{
return $arr;
}
}
/*
密码生成规则
$password -string 要转化的字符串
return string
*/
public static function password_hash_tp($password)
{
return hash("md5", trim($password));
}
/*
字符串截取函数
$str -string 被截取的字符串
$start -int 起始位置
$length -int 截取长度
$charset -string 编码
$suffix -boolean 在$str的结尾拼接省略号默认true
return string
*/
public static function msubstr($str, $start, $length, $charset = "utf-8", $suffix = true)
{
if (strlen($str) / 3 > $length) {
if (function_exists("mb_substr")) {
if ($suffix == false) {
return mb_substr($str, $start, $length, $charset) . '&nbsp;...';
} else {
return mb_substr($str, $start, $length, $charset);
}
} elseif (function_exists('iconv_substr')) {
if ($suffix == false) {
return iconv_substr($str, $start, $length, $charset) . '&nbsp;...';
} else {
return iconv_substr($str, $start, $length, $charset);
}
}
$re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
$re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
$re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
$re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
preg_match_all($re[$charset], $str, $match);
$slice = join("", array_slice($match[0], $start, $length));
if ($suffix) {
return $slice;
} else {
return $slice;
}
}
return $str;
}
/*
获取指定长度的随机字符串
$length 取值长度
return string
*/
public static function get_rand_char($length)
{
$str = null;
$strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
$max = strlen($strPol) - 1;
for ($i = 0; $i < $length; $i++) {
$str .= $strPol[rand(0, $max)];//rand($min,$max)生成介于min和max两个数之间的一个随机整数
}
return $str;
}
/*
隐藏电话中间四位数
$num -string 电话号码
return string
*/
public static function hide_phone($num)
{
return substr($num, 0, 3) . '****' . substr($num, 7);
}
/*
匹配特殊字符
$word -string 匹配特殊字符
*/
public static function match_special_str($word)
{
if (preg_match("/[\'.,:;*?~`!@#$%^&+=<>{}]|\]|\[|\/|\\\|\"|\|/", $word)) {
//不允许特殊字符
return true;
} else {
return false;
}
}
// +----------------------------------------------------------------------
// 数据加密处理
// +----------------------------------------------------------------------
//id加密
public static function encryption($str)
{
$hash = config('hashids');
return hashids($hash['length'], $hash['salt'])->encode($str);
}
//id解密
public static function decrypt($str)
{
$hash = config('hashids');
return hashids($hash['length'], $hash['salt'])->decode($str);
}
//token加密
public static function encryptionToken($id)
{
$str = encryption($id);
$time = md5(strtotime(date('Y-m-d')));
$str = base64_encode($str . '-' . $time);
return $str;
}
//token解密
public static function decryptToken($str)
{
$str = base64_decode($str);
$arr = explode('-', $str);
$time = md5(strtotime(date('Y-m-d')));
if ($arr[1] != $time) {
return false;
}
return decrypt($arr[0]);
}
/* @param string $string 原文或者密文
* @param string $operation 操作(ENCODE | DECODE), 默认为 DECODE
* @param string $key 密钥
* @param int $expiry 密文有效期, 加密时候有效, 单位 秒0 为永久有效
* @return string 处理后的 原文或者 经过 base64_encode 处理后的密文
*
* @example
*
* $a = authcode('abc', 'ENCODE', 'key');
* $b = authcode($a, 'DECODE', 'key'); // $b(abc)
*
* $a = authcode('abc', 'ENCODE', 'key', 3600);
* $b = authcode('abc', 'DECODE', 'key'); // 在一个小时内,$b(abc),否则 $b 为空
*/
public static function authcode($string, $operation = 'DECODE', $key = '', $expiry = 3600) {
$ckey_length = 4;
// 随机密钥长度 取值 0-32;
// 加入随机密钥,可以令密文无任何规律,即便是原文和密钥完全相同,加密结果也会每次不同,增大破解难度。
// 取值越大,密文变动规律越大,密文变化 = 16 的 $ckey_length 次方
// 当此值为 0 时,则不产生随机密钥
$key = md5($key ? $key : 'default_key'); //这里可以填写默认key值
$keya = md5(substr($key, 0, 16));
$keyb = md5(substr($key, 16, 16));
$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
$cryptkey = $keya.md5($keya.$keyc);
$key_length = strlen($cryptkey);
$string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
$string_length = strlen($string);
$result = '';
$box = range(0, 255);
$rndkey = array();
for($i = 0; $i <= 255; $i++) {
$rndkey[$i] = ord($cryptkey[$i % $key_length]);
}
for($j = $i = 0; $i < 256; $i++) {
$j = ($j + $box[$i] + $rndkey[$i]) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
}
for($a = $j = $i = 0; $i < $string_length; $i++) {
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256;
$tmp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $tmp;
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
}
if($operation == 'DECODE') {
if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
return substr($result, 26);
} else {
return '';
}
} else {
return $keyc.str_replace('=', '', base64_encode($result));
}
}
public static function ssoTokenEncode($str,$key='lvzhesso',$expire=0){
$ids=encryption($str);
return authcode($ids,"ENCODE",$key,$expire);
}
public static function ssoTokenDecode($str,$key='lvzhesso')
{
$ids=authcode($str,"DECODE",$key);
try{
return decrypt($ids);
}catch(\Exception $e){
return '';
}
}
/*
获取url中的主机名
$url -string
return string
*/
public static function getHost($url)
{
if(!preg_match('/http[s]:\/\/[\w.]+[\w\/]*[\w.]*\??[\w=&\+\%]*/is',$url)){
return '';
}
$search = '~^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?~i';
$url = trim($url);
preg_match_all($search, $url ,$rr);
return $rr[4][0];
}
/*
替换特殊字符
$url -string
return string
*/
public static function strFilter($str,$is_file=false){
$str = str_replace('`', '', $str);
$str = str_replace('·', '', $str);
$str = str_replace('~', '', $str);
$str = str_replace('!', '', $str);
$str = str_replace('', '', $str);
$str = str_replace('@', '', $str);
$str = str_replace('#', '', $str);
$str = str_replace('$', '', $str);
$str = str_replace('¥', '', $str);
$str = str_replace('%', '', $str);
$str = str_replace('……', '', $str);
$str = str_replace('&', '', $str);
$str = str_replace('*', '', $str);
$str = str_replace('(', '', $str);
$str = str_replace(')', '', $str);
$str = str_replace('', '', $str);
$str = str_replace('', '', $str);
$str = str_replace('-', '', $str);
$str = str_replace('_', '', $str);
$str = str_replace('——', '', $str);
$str = str_replace('+', '', $str);
$str = str_replace('=', '', $str);
$str = str_replace('|', '', $str);
$str = str_replace('\\', '', $str);
$str = str_replace('[', '', $str);
$str = str_replace(']', '', $str);
$str = str_replace('【', '', $str);
$str = str_replace('】', '', $str);
$str = str_replace('{', '', $str);
$str = str_replace('}', '', $str);
$str = str_replace(';', '', $str);
$str = str_replace('', '', $str);
$str = str_replace(':', '', $str);
$str = str_replace('', '', $str);
$str = str_replace('\'', '', $str);
$str = str_replace('"', '', $str);
$str = str_replace('“', '', $str);
$str = str_replace('”', '', $str);
$str = str_replace(',', '', $str);
$str = str_replace('', '', $str);
$str = str_replace('<', '', $str);
$str = str_replace('>', '', $str);
$str = str_replace('《', '', $str);
$str = str_replace('》', '', $str);
$str = str_replace('。', '', $str);
$str = str_replace('/', '', $str);
$str = str_replace('、', '', $str);
$str = str_replace('?', '', $str);
$str = str_replace('', '', $str);
if(!$is_file){
$str = str_replace('.', '', $str);
}
return trim($str);
}
/**
* 隐藏公司名或人名的中间部分
* @param string $str 需要处理的字符串
* @return string 处理后的字符串
*/
public static function maskString($str,$i=3) {
// 获取字符串长度
$len = self::get_string_length($str);
// 如果数组长度小于等于2则只将第二个字符替换为*
if ($len <= 1) {
return '******';
}elseif ($len == 2) {
return self::msubstr($str,0,1).'*';
} else {
return self::msubstr($str,0,$i).'******'.self::msubstr($str,-$i,$i);
}
}
/**
* 获取人名的最后一个字或者两个字
* @param string $str 需要处理的字符串
* @return string 处理后的字符串
*/
public static function getLastName($str,$i=1) {
// 获取字符串长度
$len = self::get_string_length($str);
// 如果数组长度小于等于2则只将第二个字符替换为*
if ($len < 2) {
return self::msubstr($str,0,1);
}else{
return self::msubstr($str,-$i,$i);
}
}
public static function get_string_length($str) {
// 将字符串转换为 UTF-8 编码
$str = mb_convert_encoding($str, 'UTF-8', mb_detect_encoding($str));
// 返回字符串的字符数
return mb_strlen($str);
}
// 提取身份证中的年龄和性别
public static function getIdforAG($str){
if(!$str){
return false;
}
// 先验证是否为身份证
if(!preg_match('/(^\d{15}$)|(^\d{17}([0-9]|X)$)/',$str)){
return false;
}
$length=strlen($str);
if($length==15){
$sexnum = substr($str,14,1);
$age = date('Y') - '19'.substr($str,6,2);
}else{
$sexnum = substr($str,16,1);
$age = date('Y') - substr($str,6,4);
}
return [
'gender'=>$sexnum%2==0 ? 0 : 1,
'age'=>$age
];
}
/**
* Universally Unique Identifier v4
*
* @param int $b
* @return UUID, if $b returns binary(16)
*/
public static function getUuid($b = null)
{
if (function_exists('uuid_create')) {
$uuid = uuid_create();
} else {
$uuid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xfff) | 0x4000, mt_rand(0, 0x3fff) | 0x8000, mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff));
}
return $b ? pack('H*', str_replace('-', '', $uuid)) : $uuid;
}
}