2 Star 0 Fork 0

陈保成个人仓/代码组件库

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
Str.php 22.23 KB
一键复制 编辑 原始数据 按行查看 历史
chenyue 提交于 2021-07-30 14:05 +08:00 . 第一次提交
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774
<?php
namespace aiwei;
/**
* 字符串处理
* Class Str
* @package aiwei
*/
class Str
{
/**
* 将字符串分割为数组
*
* @param $str
*
* @return array[]|false|string[]
*/
public static function mb_str_split($str)
{
return preg_split('/(?<!^)(?!$)/u', $str);
}
/**
* 按符号截取字符串的指定部分
*
* @param string $str 需要截取的字符串
* @param string $sign 需要截取的符号
* @param int $number 如是正数以0为起点从左向右截 负数则从右向左截
*
* @return string 返回截取的内容
*/
/*
示例
$str='123/456/789';
cut_str($str,'/',0); 返回 123
cut_str($str,'/',-1); 返回 789
cut_str($str,'/',-2); 返回 456
具体参考 http://baijunyao.com/article/18
*/
public static function cut_str($str, $sign, $number)
{
$array = explode($sign, $str);
$length = count($array);
if ($number < 0) {
$new_array = array_reverse($array);
$abs_number = abs($number);
if ($abs_number > $length) {
return 'error';
} else {
return $new_array[$abs_number - 1];
}
} else {
if ($number >= $length) {
return 'error';
} else {
return $array[$number];
}
}
}
/**
* 格式化字节
*
* @param $size string Bytes
* @return string
*/
public static function formatBytes($size)
{
if ($size >= 1073741824) {
$size = round($size / 1073741824 * 100) / 100 . 'GB';
} elseif ($size >= 1048576) {
$size = round($size / 1048576 * 100) / 100 . 'MB';
} elseif ($size >= 1024) {
$size = round($size / 1024 * 100) / 100 . 'KB';
} else {
$size = $size . 'Bytes';
}
return $size;
}
/**
* 中文字串截取(无乱码)
*
* @param $string string 需要截取的字符串
* @param $start int 开始
* @param $length int 截取长度
* @return string string 截取后字符串
*/
public static function getSubstr($string, $start, $length)
{
if (mb_strlen($string, 'utf-8') > $length) {
$str = mb_substr($string, $start, $length, 'utf-8');
return $str . '...';
} else {
return $string;
}
}
/**
* 获取url 中的各个参数 类似于pay_code=alipay&bank_code=ICBC-DEBIT
* @param $str string $str
* @return array
*/
public static function parse_url_param($str)
{
$data = [];
$str = explode('?', $str);
$str = end($str);
$parameter = explode('&', $str);
foreach ($parameter as $val) {
$tmp = explode('=', $val);
$data[$tmp[0]] = $tmp[1];
}
return $data;
}
/**
* 获取整条字符串汉字拼音首字母
*
* @param $zh
* @return string
*/
public static function pinyin_long($zh)
{
$ret = "";
$s1 = iconv("UTF-8", "gb2312", $zh);
$s2 = iconv("gb2312", "UTF-8", $s1);
if ($s2 == $zh) {
$zh = $s1;
}
for ($i = 0; $i < strlen($zh); $i++) {
$s1 = substr($zh, $i, 1);
$p = ord($s1);
if ($p > 160) {
$s2 = substr($zh, $i++, 2);
$ret .= self::getFirstCharter($s2);
} else {
$ret .= $s1;
}
}
return $ret;
}
/**
* 获取中文字符拼音首字母
*
* @param $str
* @return string|null
*/
public static function getFirstCharter($str)
{
if (empty($str)) {
return '';
}
$fchar = ord($str{0});
if ($fchar >= ord('A') && $fchar <= ord('z')) {
return strtoupper($str{0});
}
$s1 = iconv('UTF-8', 'gb2312//TRANSLIT//IGNORE', $str);
$s2 = iconv('gb2312', 'UTF-8//TRANSLIT//IGNORE', $s1);
$s = $s2 == $str ? $s1 : $str;
$asc = ord($s{0}) * 256 + ord($s{1}) - 65536;
if ($asc >= -20319 && $asc <= -20284) {
return 'A';
}
if ($asc >= -20283 && $asc <= -19776) {
return 'B';
}
if ($asc >= -19775 && $asc <= -19219) {
return 'C';
}
if ($asc >= -19218 && $asc <= -18711) {
return 'D';
}
if ($asc >= -18710 && $asc <= -18527) {
return 'E';
}
if ($asc >= -18526 && $asc <= -18240) {
return 'F';
}
if ($asc >= -18239 && $asc <= -17923) {
return 'G';
}
if ($asc >= -17922 && $asc <= -17418) {
return 'H';
}
if ($asc >= -17417 && $asc <= -16475) {
return 'J';
}
if ($asc >= -16474 && $asc <= -16213) {
return 'K';
}
if ($asc >= -16212 && $asc <= -15641) {
return 'L';
}
if ($asc >= -15640 && $asc <= -15166) {
return 'M';
}
if ($asc >= -15165 && $asc <= -14923) {
return 'N';
}
if ($asc >= -14922 && $asc <= -14915) {
return 'O';
}
if ($asc >= -14914 && $asc <= -14631) {
return 'P';
}
if ($asc >= -14630 && $asc <= -14150) {
return 'Q';
}
if ($asc >= -14149 && $asc <= -14091) {
return 'R';
}
if ($asc >= -14090 && $asc <= -13319) {
return 'S';
}
if ($asc >= -13318 && $asc <= -12839) {
return 'T';
}
if ($asc >= -12838 && $asc <= -12557) {
return 'W';
}
if ($asc >= -12556 && $asc <= -11848) {
return 'X';
}
if ($asc >= -11847 && $asc <= -11056) {
return 'Y';
}
if ($asc >= -11055 && $asc <= -10247) {
return 'Z';
}
return null;
}
/**
* 截取字符串长度
*
* @param string $sourcestr 要被截取的字符串
* @param int $cutlength 截取的长度
* @return string
*/
public static function cutStr($sourcestr, $cutlength)
{
$sourcestr = self::replaceHtml($sourcestr);
$returnstr = "";
$i = 0;
$n = 0;
$str_length = strlen($sourcestr);
// 字符串的字节数
while (($n < $cutlength) and ($i <= $str_length)) {
$temp_str = substr($sourcestr, $i, 1);
$ascnum = Ord($temp_str);
// 得到字符串中第$i位字符的ascii码
// 如果ASCII位高与224,
if ($ascnum >= 224) {
$returnstr .= substr($sourcestr, $i, 3);
// 根据UTF-8编码规范,将3个连续的字符计为单个字符
$i = $i + 3;
// 实际Byte计为3
$n++; // 字串长度计1
// 如果ASCII位高与192,
} elseif ($ascnum >= 192) {
$returnstr = $returnstr . substr($sourcestr, $i, 2);
// 根据UTF-8编码规范,将2个连续的字符计为单个字符
$i = $i + 2;
// 实际Byte计为2
$n++; // 字串长度计1
// 如果是大写字母,
} elseif ($ascnum >= 65 && $ascnum <= 90) {
$returnstr = $returnstr . substr($sourcestr, $i, 1);
$i = $i + 1;
// 实际的Byte数仍计1个
$n++; // 但考虑整体美观,大写字母计成一个高位字符
} else { // 其他情况下,包括小写字母和半角标点符号,
$returnstr = $returnstr . substr($sourcestr, $i, 1);
$i = $i + 1;
// 实际的Byte数计1个
$n = $n + 0.5; // 小写字母和半角标点等与半个高位字符宽…
}
}
if ($str_length > $i) {
$returnstr .= "...";
// 超过长度时在尾处加上省略号
}
return $returnstr;
}
/**
* 去除字符串中的HTML JS CSS
*
* @param string $string 需要处理的字符串
* @return string 纯文本字符串
*/
public static function replaceHtml($string)
{
if (empty ($string)) {
return "";
}
$search = [
"'<script[^>]*?>.*?</script>'si",
"'<style[^>]*?>.*?</style>'si",
"'<[/!]*?[^<>]*?>'si",
"'<!--[/!]*?[^<>]*?>'si",
];
$replace = ["", "", "", ""];
$string = preg_replace($search, $replace, $string);
return str_replace([" ", " ", "\r", "\n", "&nbsp;"], "", $string);
}
/**
* 删除指定标签
*
* @param array $tags 删除的标签 数组形式
* @param string $str html字符串
* @param bool $content true保留标签的内容text
* @return mixed
*/
public static function strip_html_tags($tags, $str, $content = true)
{
$html = [];
// 是否保留标签内的text字符
if ($content) {
foreach ($tags as $tag) {
$html[] = '/(<' . $tag . '.*?>(.|\n)*?<\/' . $tag . '>)/is';
}
} else {
foreach ($tags as $tag) {
$html[] = '/(<(?:\\/' . $tag . '|' . $tag . ')[^>]*>)/is';
}
}
return preg_replace($html, '', $str);
}
/**
* 数字转大写(人民币)
* 只支持11位数,9位整数+2位小数
* @param $num
* @return mixed
*/
public static function numRmb($num)
{
$array1 = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
$array2 = [
'-1' => '角',
'0' => '分',
'1' => '元',
'2' => '拾',
'3' => '佰',
'4' => '仟',
'5' => '万',
'6' => '',
'7' => '',
'8' => '',
'9' => '亿',
];
# 只允许输入2位小数
$data = explode('.', round($num, 2));
# 先来弄整数部分
$length = strlen($data[0]);
$rmb = '';
for ($i = 1; $i <= $length; $i++) {
$num = $length - $i;
$k = substr($data[0], $i - 1, 1);
$m = substr($data[0], $i, 1);
# 判断是不是连续的零
$status = ($k == 0) ? true : false;
# 处理万级以上数
if ($num > 4) {
if ($status == true) {
$rmb .= $array1[0];
} else {
$rmb .= $array1[$k] . $array2[$num + 1];
# 千万级别的时候会重复出现万数
if ($num != 8) {
$rmb .= $array2[$num - 3];
}
if ($num == 7 || $num == 6 || $num == 5) {
$rmb = str_replace('万', '', $rmb);
$rmb .= '万';
}
}
# 处理千级以下数
} else {
if ($status == true) {
$rmb .= $array1[0];
} else {
$rmb .= $array1[$k] . $array2[$num + 1];
}
}
}
# 再弄小数部分
if (!empty($data[1])) {
$length = strlen($data[1]);
for ($i = 0; $i < $length; $i++) {
$k = substr($data[1], $i, 1);
$rmb .= $array1[$k] . $array2[$i - 1];
}
} else {
$rmb .= '整';
}
# 要替换6个零,因为可能存在7个零的情况
$rmb = str_replace(['零零', '零零', '零零'], '零', $rmb);
# 兼容一些特殊情况
return str_replace(['零角', '零零'], '零', $rmb);
}
/**
* 生成首字母头像
* @param $text
* @return string
*/
public static function letter_avatar($text)
{
$total = unpack('L', hash('adler32', $text, true))[1];
$hue = $total % 360;
[$r, $g, $b] = self::hsv2rgb($hue / 360, 0.3, 0.9);
$bg = "rgb({$r},{$g},{$b})";
$color = "#ffffff";
$first = mb_strtoupper(mb_substr($text, 0, 1));
$src = base64_encode('<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="100" width="100"><rect fill="' . $bg . '" x="0" y="0" width="100" height="100"></rect><text x="50" y="50" font-size="50" text-copy="fast" fill="' . $color . '" text-anchor="middle" text-rights="admin" alignment-baseline="central">' . $first . '</text></svg>');
$value = 'data:image/svg+xml;base64,' . $src;
return $value;
}
public static function hsv2rgb($h, $s, $v)
{
$r = $g = $b = 0;
$i = floor($h * 6);
$f = $h * 6 - $i;
$p = $v * (1 - $s);
$q = $v * (1 - $f * $s);
$t = $v * (1 - (1 - $f) * $s);
switch ($i % 6) {
case 0:
$r = $v;
$g = $t;
$b = $p;
break;
case 1:
$r = $q;
$g = $v;
$b = $p;
break;
case 2:
$r = $p;
$g = $v;
$b = $t;
break;
case 3:
$r = $p;
$g = $q;
$b = $v;
break;
case 4:
$r = $t;
$g = $p;
$b = $v;
break;
case 5:
$r = $v;
$g = $p;
$b = $q;
break;
}
return [
floor($r * 255),
floor($g * 255),
floor($b * 255),
];
}
/**
* 转换数字为简短形式
* @param $n int 要转换的数字
* @param $precision int 精度
*/
public static function shortenNumber($n, $precision = 1)
{
if ($n < 1e+3) {
$out = number_format($n);
} else {
if ($n < 1e+6) {
$out = number_format($n / 1e+3, $precision) . 'k';
} else {
if ($n < 1e+9) {
$out = number_format($n / 1e+6, $precision) . 'm';
} else {
if ($n < 1e+12) {
$out = number_format($n / 1e+9, $precision) . 'b';
}
}
}
}
return $out;
}
/**
* 剔除微信昵称中的emoji表情
* @param $str
* @return string|string[]|null
*/
public static function filterEmoji($str)
{
$str = preg_replace_callback('/./u',
function (array $match) {
return strlen($match[0]) >= 4 ? '' : $match[0];
},
$str);
return $str;
}
/**
* 检查字符串中是否包含另一字符串
* @param string $haystack 被检查的字符串
* @param string|array $needles 需要包含的字符串
* @param bool $strict 为true 则检查时区分大小写
* @return bool
* @author : evalor <master@evalor.cn>
*/
public static function contains($haystack, $needles, $strict = true)
{
// 不区分大小写的情况下 全部转为小写
if (!$strict) {
$haystack = mb_strtolower($haystack);
}
// 支持以数组方式传入 needles 检查多个字符串
foreach ((array)$needles as $needle) {
if (!$strict) {
$needle = mb_strtolower($needle);
}
if ($needle != '' && mb_strpos($haystack, $needle) !== false) {
return true;
}
}
return false;
}
/**
* 检查字符串是否以某个字符串开头
* @param string $haystack 被检查的字符串
* @param string $needles 需要包含的字符串
* @param bool $strict 为true 则检查时区分大小写
* @return bool
* @author : evalor <master@evalor.cn>
*/
public static function startsWith($haystack, $needles, $strict = true)
{
// 不区分大小写的情况下 全部转为小写
if (!$strict) {
$haystack = mb_strtolower($haystack);
}
// 支持以数组方式传入 needles 检查多个字符串
foreach ((array)$needles as $needle) {
if (!$strict) {
$needle = mb_strtolower($needle);
}
if ($needle != '' && mb_strpos($haystack, $needle) === 0) {
return true;
}
}
return false;
}
/**
* 检查字符串是否以某个字符串结尾
* @param string $haystack 被检查的字符串
* @param string $needles 需要包含的字符串
* @param bool $strict 为true 则检查时区分大小写
* @return bool
* @author : evalor <master@evalor.cn>
*/
public static function endsWith($haystack, $needles, $strict = true)
{
// 不区分大小写的情况下 全部转为小写
if (!$strict) {
$haystack = mb_strtolower($haystack);
}
// 支持以数组方式传入 needles 检查多个字符串
foreach ((array)$needles as $needle) {
if (!$strict) {
$needle = mb_strtolower($needle);
}
if ((string)$needle === mb_substr($haystack, -mb_strlen($needle))) {
return true;
}
}
return false;
}
/**
* 驼峰转下划线
* @param string $value 待处理字符串
* @param string $delimiter 分隔符
* @return null|string|string[]
* @author : evalor <master@evalor.cn>
*/
public static function snake($value, $delimiter = '_')
{
if (!ctype_lower($value)) {
$value = preg_replace('/\s+/u', '', $value);
$value = mb_strtolower(preg_replace('/(.)(?=[A-Z])/u', '$1' . $delimiter, $value));
}
return $value;
}
/**
* 下划线转驼峰 (首字母小写)
* @param string $value 待处理字符串
* @return string
* @author : evalor <master@evalor.cn>
*/
public static function camel($value)
{
return lcfirst(static::studly($value));
}
/**
* 下划线转驼峰 (首字母大写)
* @param string $value 待处理字符串
* @return mixed
* @author : evalor <master@evalor.cn>
*/
public static function studly($value)
{
$value = ucwords(str_replace(['-', '_'], ' ', $value));
return str_replace(' ', '', $value);
}
/**
* PHP利用正则表达式实现手机号码中间4位用星号替换显示
* @param $phone
* @return string|string[]|null
*/
public static function hideTel($phone)
{
$IsWhat = preg_match('/(0[0-9]{2,3}[-]?[2-9][0-9]{6,7}[-]?[0-9]?)/i', $phone); //固定电话
if ($IsWhat === 1) {
return preg_replace('/(0[0-9]{2,3}[-]?[2-9])[0-9]{3,4}([0-9]{3}[-]?[0-9]?)/i', '$1****$2', $phone);
}
return preg_replace('/(1[358]{1}[0-9])[0-9]{4}([0-9]{4})/i', '$1****$2', $phone);
}
/**
* [NameSplit 姓名拆分]
* @param [type] $name [需要处理的姓名]
* @param string $replace [是否需要替换处理 默认将名字部分替换成* 不提换返回数组,包含姓和名 ]
* @Authors David 2017-7-31 09:34:16
*/
public static function NameSplit($name, $replace = '*')
{
$CompoundSurname = [
'欧阳',
'太史',
'端木',
'上官',
'司马',
'东方',
'独孤',
'南宫',
'万俟',
'闻人',
'夏侯',
'诸葛',
'尉迟',
'公羊',
'赫连',
'澹台',
'皇甫',
'宗政',
'濮阳',
'公冶',
'太叔',
'申屠',
'公孙',
'慕容',
'仲孙',
'钟离',
'长孙',
'宇文',
'城池',
'司徒',
'鲜于',
'司空',
'汝嫣',
'闾丘',
'子车',
'亓官',
'司寇',
'巫马',
'公西',
'颛孙',
'壤驷',
'公良',
'漆雕',
'乐正',
'宰父',
'谷梁',
'拓跋',
'夹谷',
'轩辕',
'令狐',
'段干',
'百里',
'呼延',
'东郭',
'南门',
'羊舌',
'微生',
'公户',
'公玉',
'公仪',
'梁丘',
'公仲',
'公上',
'公门',
'公山',
'公坚',
'左丘',
'公伯',
'西门',
'公祖',
'第五',
'公乘',
'贯丘',
'公皙',
'南荣',
'东里',
'东宫',
'仲长',
'子书',
'子桑',
'即墨',
'达奚',
'褚师'
];
$nameLength = mb_strlen($name, 'utf-8');
if ($nameLength > 2) {
$Surname = mb_substr($name, 0, 2, 'utf-8'); // 截取姓名前两个字
if (in_array($Surname, $CompoundSurname)) { // 判断是否是复姓
$length = $nameLength - 2;
} else {
$Surname = mb_substr($name, 0, 1, 'utf-8'); // 获取姓氏
$length = $nameLength - 1;
}
} else {
$Surname = mb_substr($name, 0, 1, 'utf-8'); // 获取姓氏
$length = $nameLength - 1;
}
//判断是否执行替换
if ($replace) {
$str = '';
//生产替换字符串
for ($i = 0; $i < $length; $i++) {
$str .= $replace;
}
$NameSplit = $Surname . $str;
} else {
$NameSplit = ['Surname' => $Surname, 'name' => mb_substr($name, $nameLength - $length, $length, 'utf-8')];
}
return $NameSplit;
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/I-V_NETWORK/code-component.git
git@gitee.com:I-V_NETWORK/code-component.git
I-V_NETWORK
code-component
代码组件库
master

搜索帮助