StrUtils.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  1. <?php
  2. /**
  3. * StrUtils.php UTF-8
  4. *
  5. *
  6. * @date : 2018/4/23 10:41
  7. *
  8. * @license 这不是一个自由软件,未经授权不许任何使用和传播。
  9. * @author : wuyonghong <wyh@huosdk.com>
  10. * @version : HUOSDK 8.0
  11. */
  12. namespace huolib\tool;
  13. use huolib\constant\WalletConst;
  14. class StrUtils {
  15. /**
  16. * 去除所有空格
  17. *
  18. * @param $str
  19. *
  20. * @return mixed
  21. */
  22. public static function trimAll($str) {
  23. $_rule = array(" ", " ", "\t", "\n", "\r");
  24. $_replace = array("", "", "", "", "");
  25. return str_replace($_rule, $_replace, $str);
  26. }
  27. /**
  28. * 校验是否为合法手机号
  29. *
  30. * @param $phone
  31. *
  32. * @return false|int
  33. */
  34. public static function checkPhone($phone) {
  35. $_pattern = "/^1[23456789]\d{9}$/";
  36. return preg_match($_pattern, $phone);
  37. }
  38. /**
  39. * 校验是否为合法Email
  40. *
  41. * @param $email
  42. *
  43. * @return false|int
  44. */
  45. public static function checkEmail($email) {
  46. $_pattern = "/^([0-9A-Za-z\\-_\\.]+)@([0-9a-z]+\\.[a-z]{2,3}(\\.[a-z]{2})?)$/i";
  47. return preg_match($_pattern, $email);
  48. }
  49. /**
  50. * 校验是否是合法的英文与数字
  51. *
  52. * @param string $str
  53. *
  54. * @return false|int
  55. */
  56. public static function checkEnStrAndNum($str) {
  57. $_pattern = "/^[a-zA-Z0-9]+$/i";
  58. return preg_match($_pattern, $str);
  59. }
  60. /**
  61. * 校验是否是合法的可打印字符
  62. *
  63. * @param string $str
  64. *
  65. * @return false|int
  66. */
  67. public static function checkPrintStr($str) {
  68. $_pattern = "/^[A-Za-z0-9`~!@#$%^&*()_\-+=<>?:\"{}|,.\/;'\\[\]]+$/i";
  69. return preg_match($_pattern, $str);
  70. }
  71. /**
  72. * 手机中间四位加密
  73. *
  74. * @param string $phone
  75. * @param int $start
  76. * @param int $length
  77. *
  78. * @return null|string
  79. */
  80. public static function encryptPhone($phone = '', $start = 3, $length = 4) {
  81. if (empty($phone)) {
  82. return '';
  83. }
  84. if (false == self::checkPhone($phone)) {
  85. return false;
  86. }
  87. $replacement = str_pad('', $length, '*');
  88. return substr_replace($phone, $replacement, $start, $length);
  89. //return preg_replace('/(^.*)\d{4}(\d{4})$/', '\\1****\\2', $phone);
  90. }
  91. /**
  92. * 身份证号加密
  93. *
  94. * @param string $id_card 证件号
  95. * @param int $start 开始长度
  96. * @param int $end 结尾长度
  97. *
  98. * @return null|string
  99. */
  100. public static function encryptIdCard($id_card = '', $start = 3, $end = 2) {
  101. if (empty($id_card)) {
  102. return '';
  103. }
  104. $_length = strlen($id_card);
  105. $length = $_length - $end - $start;
  106. $replacement = str_pad('', $length, '*');
  107. return substr_replace($id_card, $replacement, $start, $length);
  108. }
  109. /**
  110. * 名字加密
  111. *
  112. * @param string $name 名字
  113. *
  114. * @return mixed
  115. */
  116. public static function encryptName($name) {
  117. if (empty($name)) {
  118. return '';
  119. }
  120. $encrypt_name = '';
  121. //判断是否包含中文字符
  122. if (preg_match("/[\x{4e00}-\x{9fa5}]+/u", $name)) {
  123. //按照中文字符计算长度
  124. $len = mb_strlen($name, 'UTF-8');
  125. //echo '中文';
  126. if ($len >= 3) {
  127. //三个字符或三个字符以上掐头取尾,中间用*代替
  128. $encrypt_name = mb_substr($name, 0, 1, 'UTF-8').str_repeat('*', $len - 2).mb_substr(
  129. $name, -1, 1, 'UTF-8'
  130. );
  131. } elseif ($len === 2) {
  132. //两个字符
  133. $encrypt_name = mb_substr($name, 0, 1, 'UTF-8').'*';
  134. }
  135. } else {
  136. //按照英文字串计算长度
  137. $len = strlen($name);
  138. //echo 'English';
  139. if ($len >= 3) {
  140. //三个字符或三个字符以上掐头取尾,中间用*代替
  141. $encrypt_name = substr($name, 0, 1).str_repeat('*', $len - 2).substr($name, -1);
  142. } elseif ($len === 2) {
  143. //两个字符
  144. $encrypt_name = substr($name, 0, 1).'*';
  145. }
  146. }
  147. return $encrypt_name;
  148. }
  149. /**
  150. * 邮箱加密
  151. *
  152. * @param string $email
  153. *
  154. * @return bool|string
  155. */
  156. public static function encryptEmail($email = '') {
  157. if (false == self::checkEmail($email)) {
  158. return false;
  159. }
  160. $_str = $email;
  161. $_email_array = explode("@", $_str);
  162. $_prev_fix = (strlen($_email_array[0]) < 4) ? "" : substr($_str, 0, 3); //邮箱前缀
  163. $_count = 0;
  164. $_str = preg_replace('/([\d\w+_-]{0,100})@/', '***@', $_str, -1, $_count);
  165. return $_prev_fix.$_str;
  166. }
  167. /**
  168. * 解析字符串
  169. *
  170. * @param string $str
  171. *
  172. * @return array
  173. */
  174. public static function parseStr($str = '') {
  175. $_str_arr = explode('&', $str);
  176. $_data_arr = array();
  177. foreach ($_str_arr as $_key => $_val) {
  178. $_pair = explode('=', $_val, 2);
  179. $_data_arr[$_pair[0]] = $_pair[1];
  180. }
  181. return $_data_arr;
  182. }
  183. /**
  184. * 获取随机字符串
  185. *
  186. * @param $length
  187. *
  188. * @return null|string
  189. */
  190. public static function getRandChars($length) {
  191. $str = null;
  192. $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
  193. $max = strlen($strPol) - 1;
  194. for ($i = 0; $i < $length; $i++) {
  195. $str .= $strPol[rand(0, $max)];//rand($min,$max)生成介于min和max两个数之间的一个随机整数
  196. }
  197. return $str;
  198. }
  199. /**
  200. * 创建链接字符串
  201. *
  202. * @param array $para
  203. *
  204. * @return bool|string
  205. */
  206. public static function createLinkString(array $para) {
  207. $_arg = "";
  208. while (list($_key, $_val) = self::funcNewEach($para)) {
  209. $_arg .= $_key."=".urlencode($_val)."&";
  210. }
  211. // 去掉最后一个&字符
  212. $_arg = substr($_arg, 0, strlen($_arg) - 1);
  213. // 如果存在转义字符,那么去掉转义
  214. if (get_magic_quotes_gpc()) {
  215. $_arg = stripslashes($_arg);
  216. }
  217. return $_arg;
  218. }
  219. public static function funcNewEach(&$array) {
  220. $_res = array();
  221. $_key = key($array);
  222. if ($_key !== null) {
  223. next($array);
  224. $res[1] = $_res['value'] = $array[$_key];
  225. $res[0] = $_res['key'] = $_key;
  226. } else {
  227. $res = false;
  228. }
  229. return $res;
  230. }
  231. //生成订单号
  232. /**
  233. * 生成订单号
  234. *
  235. * @param int $login_ch
  236. * @param int $pay_ch
  237. * @param int $mem_id
  238. *
  239. * @param string $ext
  240. *
  241. * @return string
  242. */
  243. public static function genOrderId(
  244. $login_ch = 0, $pay_ch = 0, $mem_id = 0, $ext = WalletConst::WALLET_ORDER_PREFIX_SDK
  245. ) {
  246. list($_u_sec, $_sec) = explode(" ", microtime());
  247. // 取微秒前3位+再两位随机数+玩家ID后四位+渠道ID后四位
  248. $_order_id = $ext.$_sec.
  249. substr($_u_sec, 2, 3).
  250. sprintf("%02d", $login_ch % 100).
  251. sprintf("%02d", $pay_ch % 100).
  252. sprintf("%02d", $mem_id % 100);
  253. return $_order_id;
  254. }
  255. /**
  256. *
  257. * @param $str
  258. *
  259. * @return string
  260. */
  261. public static function genToken($str = '') {
  262. $time = time();
  263. $pay_token = md5(md5(uniqid($str)).$time);
  264. return $pay_token;
  265. }
  266. /**
  267. * 参数排序
  268. *
  269. * @param array $para
  270. *
  271. * @return array
  272. */
  273. public static function argSort(array $para) {
  274. ksort($para);
  275. reset($para);
  276. return $para;
  277. }
  278. public static function sAddAlashes($string) {
  279. if (is_array($string)) {
  280. foreach ($string as $_key => $_val) {
  281. $string[$_key] = self::sAddAlashes($_val);
  282. }
  283. } else {
  284. $string = addslashes(trim($string));
  285. }
  286. return $string;
  287. }
  288. /**
  289. * 安全过滤
  290. *
  291. * @param $string
  292. *
  293. * @return array|string
  294. */
  295. public static function safeFilter($string) {
  296. $_magic_quote = get_magic_quotes_gpc();
  297. if (empty($_magic_quote)) {
  298. $string = self::sAddAlashes($string);
  299. }
  300. if (is_array($string)) {
  301. foreach ($string as $key => $val) {
  302. $string[$key] = self::sAddAlashes($val);
  303. }
  304. } else {
  305. $string = htmlspecialchars(trim($string));
  306. }
  307. return $string;
  308. }
  309. /**
  310. * 字符串转数组
  311. *
  312. * @param $string
  313. *
  314. * @return array
  315. */
  316. public static function strToArr($string) {
  317. return is_string($string) ? explode(',', $string) : $string;
  318. }
  319. /**
  320. * 数组转化为字符串
  321. *
  322. * @access public
  323. *
  324. * @param array $arr 数组
  325. *
  326. * @return string
  327. */
  328. public static function arrToStr($arr) {
  329. return is_array($arr) ? implode(',', $arr) : '';
  330. }
  331. /**
  332. * 获取正确的URL
  333. *
  334. * @param $url
  335. *
  336. * @return string
  337. */
  338. public static function getUrl($url) {
  339. //检查链接中是否存在 ?
  340. $_check = strpos($url, '?');
  341. //如果存在 ?
  342. if (false !== $_check) {
  343. if (substr($url, $_check + 1) == '') {
  344. //可以直接加上附加参数
  345. $_new_url = $url;
  346. } else {
  347. //如果有参数,如:http://www.yitu.org/index.php?ID=12
  348. $_new_url = $url.'&';
  349. }
  350. } else {//如果不存在 ?
  351. $_new_url = $url.'?';
  352. }
  353. return $_new_url;
  354. }
  355. /**
  356. * 格式化数字
  357. *
  358. * @param float $num
  359. *
  360. * @param int $decimals 小数点后几位
  361. *
  362. * @return float
  363. */
  364. public static function formatNumber($num = 0.00, $decimals = 2) {
  365. return floatval(number_format($num, $decimals, '.', ''));
  366. }
  367. /**
  368. * 比较两个数字
  369. *
  370. * @param $num1
  371. * @param $num2
  372. *
  373. * @return int
  374. */
  375. public static function compareNumber($num1, $num2) {
  376. $_num1 = self::formatNumber($num1, 4);
  377. $_num2 = self::formatNumber($num2, 4);
  378. if ($_num1 == $_num2) {
  379. return 0;
  380. } elseif ($_num1 < $_num2) {
  381. return -1;
  382. } else {
  383. return 1;
  384. }
  385. }
  386. /**
  387. * ARPU(Average Revenue Per User) :平均每用户收入,即可通过 总收入/活跃用户 计算得出。
  388. *
  389. * @param float $sum_money
  390. * @param int $user_cnt
  391. *
  392. * @return string
  393. */
  394. public static function getArpu($sum_money, $user_cnt) {
  395. $sum_money = (float)$sum_money;
  396. $user_cnt = (float)$user_cnt;
  397. if (!is_numeric($sum_money) || !is_numeric($user_cnt)) {
  398. return '0';
  399. }
  400. if (empty($user_cnt)) {
  401. return '0';
  402. }
  403. $_arppu = $sum_money / $user_cnt;
  404. return StrUtils::formatNumber($_arppu);
  405. }
  406. /**
  407. *
  408. * @param int $cnt1
  409. * @param int $cnt2
  410. *
  411. * @return string
  412. */
  413. public static function getRate($cnt1, $cnt2) {
  414. if (!is_numeric($cnt1)) {
  415. return '0%';
  416. }
  417. if (empty($cnt2) || $cnt2 == '0.00') {
  418. return '0%';
  419. }
  420. $_rate = 100 * $cnt1 / $cnt2;
  421. return StrUtils::formatNumber($_rate).'%';
  422. }
  423. public static function isJson($str) {
  424. json_decode($str);
  425. return (json_last_error() == JSON_ERROR_NONE);
  426. }
  427. /**
  428. * 根据当前url获取路由
  429. *
  430. * @param string $url 地址
  431. *
  432. * @return:string
  433. */
  434. public static function getRoute($url) {
  435. $_url_info = parse_url($url);
  436. /*url存在scheme则只获取链接路径*/
  437. if (isset($_url_info['scheme']) && isset($_url_info['path'])) {
  438. $_url = $_url_info['path'];
  439. } else {
  440. $_url = $url;
  441. }
  442. /*处理链接参数*/
  443. $_route_arr = array_slice(explode('/', $_url), 0, 4);
  444. $_route = implode('/', $_route_arr);
  445. return $_route;
  446. }
  447. }