StringHelper.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588
  1. <?php
  2. namespace common\helpers;
  3. use Yii;
  4. use yii\helpers\BaseStringHelper;
  5. use Exception;
  6. use Ramsey\Uuid\Uuid;
  7. /**
  8. * Class StringHelper
  9. * @package common\helpers
  10. * @author jianyan74 <751393839@qq.com>
  11. */
  12. class StringHelper extends BaseStringHelper
  13. {
  14. /**
  15. * 生成Uuid
  16. *
  17. * @param string $type 类型 默认时间 time/md5/random/sha1/uniqid 其中uniqid不需要特别开启php函数
  18. * @param string $name 加密名
  19. * @return string
  20. * @throws Exception
  21. */
  22. public static function uuid($type = 'time', $name = 'php.net')
  23. {
  24. switch ($type) {
  25. // 生成版本1(基于时间的)UUID对象
  26. case 'time' :
  27. $uuid = Uuid::uuid1();
  28. break;
  29. // 生成第三个版本(基于名称的和散列的MD5)UUID对象
  30. case 'md5' :
  31. $uuid = Uuid::uuid3(Uuid::NAMESPACE_DNS, $name);
  32. break;
  33. // 生成版本4(随机)UUID对象
  34. case 'random' :
  35. $uuid = Uuid::uuid4();
  36. break;
  37. // 产生一个版本5(基于名称和散列的SHA1)UUID对象
  38. case 'sha1' :
  39. $uuid = Uuid::uuid5(Uuid::NAMESPACE_DNS, $name);
  40. break;
  41. // php自带的唯一id
  42. case 'uniqid' :
  43. return md5(uniqid(md5(microtime(true).self::random(8)), true));
  44. break;
  45. }
  46. return $uuid->toString();
  47. }
  48. /**
  49. * 日期转时间戳
  50. *
  51. * @param $value
  52. * @return false|int
  53. */
  54. public static function dateToInt($value)
  55. {
  56. if (empty($value)) {
  57. return $value;
  58. }
  59. if (!is_numeric($value)) {
  60. return strtotime($value);
  61. }
  62. return $value;
  63. }
  64. /**
  65. * 时间戳转日期
  66. *
  67. * @param $value
  68. * @return false|int
  69. */
  70. public static function intToDate($value, $format = 'Y-m-d H:i:s')
  71. {
  72. if (empty($value)) {
  73. return date($format);
  74. }
  75. if (is_numeric($value)) {
  76. return date($format, $value);
  77. }
  78. return $value;
  79. }
  80. /**
  81. * 获取缩略图地址
  82. *
  83. * @param string $url
  84. * @param int $width
  85. * @param int $height
  86. */
  87. public static function getThumbUrl($url, $width, $height)
  88. {
  89. $url = str_replace('attachment/images', 'attachment/thumb', $url);
  90. return self::createThumbUrl($url, $width, $height);
  91. }
  92. /**
  93. * 创建缩略图地址
  94. *
  95. * @param string $url
  96. * @param int $width
  97. * @param int $height
  98. */
  99. public static function createThumbUrl($url, $width, $height)
  100. {
  101. $url = explode('/', $url);
  102. $nameArr = explode('.', end($url));
  103. $url[count($url) - 1] = $nameArr[0]."@{$width}x{$height}.".$nameArr[1];
  104. return implode('/', $url);
  105. }
  106. /**
  107. * 获取压缩图片地址
  108. *
  109. * @param $url
  110. * @param $quality
  111. * @return string
  112. */
  113. public static function getAliasUrl($url, $alias = 'compress')
  114. {
  115. $url = explode('/', $url);
  116. $nameArr = explode('.', end($url));
  117. $url[count($url) - 1] = $nameArr[0]."@{$alias}.".$nameArr[1];
  118. return implode('/', $url);
  119. }
  120. /**
  121. * 根据Url获取本地绝对路径
  122. *
  123. * @param $url
  124. * @param string $type
  125. * @return string
  126. */
  127. public static function getLocalFilePath($url, $type = 'images')
  128. {
  129. if (RegularHelper::verify('url', $url)) {
  130. if (!RegularHelper::verify('url', Yii::getAlias("@attachurl"))) {
  131. $hostInfo = Yii::$app->request->hostInfo.Yii::getAlias("@attachurl");
  132. $url = str_replace($hostInfo, '', $url);
  133. } else {
  134. $url = str_replace(Yii::getAlias("@attachurl"), '', $url);
  135. }
  136. } else {
  137. $url = str_replace(Yii::getAlias("@attachurl"), '', $url);
  138. }
  139. return Yii::getAlias("@attachment").$url;
  140. }
  141. /**
  142. * 分析枚举类型配置值
  143. *
  144. * 格式 a:名称1,b:名称2
  145. *
  146. * @param $string
  147. * @return array
  148. */
  149. public static function parseAttr($string)
  150. {
  151. if (empty($string)) {
  152. return [];
  153. }
  154. $array = preg_split('/[,;\r\n]+/', trim($string, ",;\r\n"));
  155. if (strpos($string, ':')) {
  156. $value = [];
  157. foreach ($array as $val) {
  158. list($k, $v) = explode(':', $val);
  159. $value[$k] = $v;
  160. }
  161. } else {
  162. $value = $array;
  163. }
  164. return $value;
  165. }
  166. /**
  167. * 返回字符串在另一个字符串中第一次出现的位置
  168. *
  169. * @param $string
  170. * @param $find
  171. * @return bool
  172. * true | false
  173. */
  174. public static function strExists($string, $find)
  175. {
  176. return !(strpos($string, $find) === false);
  177. }
  178. /**
  179. * XML 字符串载入对象中
  180. *
  181. * @param string $string 必需。规定要使用的 XML 字符串
  182. * @param string $class_name 可选。规定新对象的 class
  183. * @param int $options 可选。规定附加的 Libxml 参数
  184. * @param string $ns
  185. * @param bool $is_prefix
  186. * @return bool|SimpleXMLElement
  187. */
  188. public static function simplexmlLoadString(
  189. $string,
  190. $class_name = 'SimpleXMLElement',
  191. $options = 0,
  192. $ns = '',
  193. $is_prefix = false
  194. ) {
  195. libxml_disable_entity_loader(true);
  196. if (preg_match('/(\<\!DOCTYPE|\<\!ENTITY)/i', $string)) {
  197. return false;
  198. }
  199. return simplexml_load_string($string, $class_name, $options, $ns, $is_prefix);
  200. }
  201. /**
  202. * 字符串提取汉字
  203. *
  204. * @param $string
  205. * @return mixed
  206. */
  207. public static function strToChineseCharacters($string)
  208. {
  209. preg_match_all("/[\x{4e00}-\x{9fa5}]+/u", $string, $chinese);
  210. return $chinese;
  211. }
  212. /**
  213. * 字符首字母转大小写
  214. *
  215. * @param $str
  216. * @return mixed
  217. */
  218. public static function strUcwords($str)
  219. {
  220. return str_replace(' ', '', ucwords(str_replace('-', ' ', $str)));
  221. }
  222. /**
  223. * 驼峰命名法转下划线风格
  224. *
  225. * @param $str
  226. * @return string
  227. */
  228. public static function toUnderScore($str)
  229. {
  230. $array = [];
  231. for ($i = 0; $i < strlen($str); $i++) {
  232. if ($str[$i] == strtolower($str[$i])) {
  233. $array[] = $str[$i];
  234. } else {
  235. if ($i > 0) {
  236. $array[] = '-';
  237. }
  238. $array[] = strtolower($str[$i]);
  239. }
  240. }
  241. return implode('', $array);
  242. }
  243. /**
  244. * 获取字符串后面的字符串
  245. *
  246. * @param string $fileName 文件名
  247. * @param string $type 字符类型
  248. * @param int $length 长度
  249. * @return bool|string
  250. */
  251. public static function clipping($fileName, $type = '.', $length = 0)
  252. {
  253. return substr(strtolower(strrchr($fileName, $type)), $length);
  254. }
  255. /**
  256. * 获取随机字符串
  257. *
  258. * @param $length
  259. * @param bool $numeric
  260. * @return string
  261. */
  262. public static function random($length, $numeric = false)
  263. {
  264. $seed = base_convert(md5(microtime().$_SERVER['DOCUMENT_ROOT']), 16, $numeric ? 10 : 35);
  265. $seed = $numeric ? (str_replace('0', '', $seed).'012340567890') : ($seed.'zZ'.strtoupper($seed));
  266. $hash = '';
  267. if (!$numeric) {
  268. $hash = chr(rand(1, 26) + rand(0, 1) * 32 + 64);
  269. $length--;
  270. }
  271. $max = strlen($seed) - 1;
  272. $seed = str_split($seed);
  273. for ($i = 0; $i < $length; $i++) {
  274. $hash .= $seed[mt_rand(0, $max)];
  275. }
  276. return $hash;
  277. }
  278. /**
  279. * 获取批量唯一码
  280. *
  281. * @param int $number
  282. * @return array
  283. */
  284. public static function randomList(int $number, $middleStr = '')
  285. {
  286. $arr = [];
  287. for ($i = 0; $i < $number; $i++) {
  288. $rand = time().$middleStr.self::random(10, true);
  289. $arr[$rand] = $rand;
  290. }
  291. if (count($arr) != $number) {
  292. $arr = ArrayHelper::merge($arr, self::randomList($number - count($arr), $middleStr));
  293. }
  294. return $arr;
  295. }
  296. /**
  297. * 清除Html & Script
  298. *
  299. * @param $document
  300. * @return array|string|string[]|null
  301. */
  302. public static function replaceHtmlAndJs($document)
  303. {
  304. $document = trim($document);
  305. if (strlen($document) <= 0) {
  306. return $document;
  307. }
  308. $search = [
  309. "'<script[^>]*?>.*?</script>'si", // 去掉 javascript
  310. "'<[\/\!]*?[^<>]*?>'si", // 去掉 HTML 标记
  311. "'([\r\n])[\s]+'", // 去掉空白字符
  312. "'&(quot|#34);'i", // 替换 HTML 实体
  313. "'&(amp|#38);'i",
  314. "'&(lt|#60);'i",
  315. "'&(gt|#62);'i",
  316. "'&(nbsp|#160);'i",
  317. ];
  318. $replace = [
  319. '',
  320. '',
  321. "\\1",
  322. "\"",
  323. "&",
  324. "<",
  325. ">",
  326. " ",
  327. ];
  328. return preg_replace($search, $replace, $document);
  329. }
  330. /**
  331. * 匹配出内容的所有图片
  332. *
  333. * @param $content
  334. * @return array
  335. */
  336. public static function getImages($content): array
  337. {
  338. preg_match_all('/<\s*img\s+[^>]*?src\s*=\s*(\'|\")(.*?)\\1[^>]*?\/?\s*>/i', $content, $matches);
  339. if (empty($matches[0])) {
  340. return [];
  341. }
  342. $imgs = [];
  343. foreach ($matches[0] as $key => $match) {
  344. $imgs[] = ['html' => $matches[0][$key], 'src' => $matches[2][$key]];
  345. }
  346. return $imgs;
  347. }
  348. /**
  349. * 去除内容的注释
  350. *
  351. * @param $content
  352. * @return string|string[]|null
  353. */
  354. public static function removeAnnotation($content)
  355. {
  356. return preg_replace("/(\/\*(\s|.)*?\*\/)|(\/\/.(\s|.*))|(#(\s*)?(.*))/", '',
  357. str_replace(["\r\n", "\r"], "\n", $content));
  358. }
  359. /**
  360. * 字符串匹配替换
  361. *
  362. * @param string $search 查找的字符串
  363. * @param string $replace 替换的字符串
  364. * @param string $subject 字符串
  365. * @param null $count
  366. * @return mixed
  367. */
  368. public static function replace($search, $replace, $subject, &$count = null)
  369. {
  370. return str_replace($search, $replace, $subject, $count);
  371. }
  372. /**
  373. * 验证是否Windows
  374. *
  375. * @return bool
  376. */
  377. public static function isWindowsOS()
  378. {
  379. return strncmp(PHP_OS, 'WIN', 3) === 0;
  380. }
  381. /**
  382. * 换行显示内容
  383. *
  384. * @param string $string 字符串
  385. * @param int $num 每行长度
  386. * @param int $cycle_index 行数
  387. * @return array
  388. */
  389. public static function textNewLine($string, $num = 26, $cycle_index = 2)
  390. {
  391. // 中文字符串长度
  392. $num = $num * 3;
  393. $data = [];
  394. $letterLength = 0;
  395. $j = 0;
  396. for ($i = 0; $i < mb_strlen($string, 'UTF-8'); $i++) {
  397. $name = mb_substr($string, $i, 1, 'UTF-8');
  398. $length = strlen($name);
  399. if ($letterLength >= $num) {
  400. $letterLength = 0;
  401. $j++;
  402. }
  403. !isset($data[$j]) && $data[$j] = '';
  404. $data[$j] .= $name;
  405. $letterLength += $length;
  406. }
  407. if (count($data) > $cycle_index) {
  408. $data[$cycle_index - 1] .= '...';
  409. }
  410. foreach ($data as $key => $datum) {
  411. if (empty($datum) || $key > $cycle_index - 1) {
  412. unset($data[$key]);
  413. }
  414. }
  415. if (empty($data)) {
  416. $data[] = $string;
  417. }
  418. return $data;
  419. }
  420. /**
  421. * @param $string
  422. * @return string
  423. */
  424. public static function strToInt($string)
  425. {
  426. $versionArr = explode('.', $string);
  427. if (count($versionArr) > 3) {
  428. return false;
  429. }
  430. $version_id = 0;
  431. isset($versionArr[0]) && $version_id += substr(BcHelper::mul((int)$versionArr[0], 100000000000), 0, 12);
  432. isset($versionArr[1]) && $version_id += substr(BcHelper::mul((int)$versionArr[1], 10000000), 0, 8);
  433. isset($versionArr[2]) && $version_id += substr(BcHelper::mul((int)$versionArr[2], 1000), 0, 4);
  434. return $version_id;
  435. }
  436. /**
  437. * 将一个字符串部分字符用*替代隐藏
  438. *
  439. * @param string $string 待转换的字符串
  440. * @param int $bengin 起始位置,从0开始计数,当$type=4时,表示左侧保留长度
  441. * @param int $len 需要转换成*的字符个数,当$type=4时,表示右侧保留长度
  442. * @param int $type 转换类型:0,从左向右隐藏;1,从右向左隐藏;2,从指定字符位置分割前由右向左隐藏;3,从指定字符位置分割后由左向右隐藏;4,保留首末指定字符串
  443. * @param string $glue 分割符
  444. * @return bool|string
  445. */
  446. public static function hideStr($string, $bengin = 0, $len = 4, $type = 0, $glue = "@")
  447. {
  448. if (empty($string)) {
  449. return false;
  450. }
  451. $array = [];
  452. if ($type == 0 || $type == 1 || $type == 4) {
  453. $strlen = $length = mb_strlen($string);
  454. while ($strlen) {
  455. $array[] = mb_substr($string, 0, 1, "utf8");
  456. $string = mb_substr($string, 1, $strlen, "utf8");
  457. $strlen = mb_strlen($string);
  458. }
  459. }
  460. switch ($type) {
  461. case 0 :
  462. for ($i = $bengin; $i < ($bengin + $len); $i++) {
  463. isset($array[$i]) && $array[$i] = "*";
  464. }
  465. $string = implode("", $array);
  466. break;
  467. case 1 :
  468. $array = array_reverse($array);
  469. for ($i = $bengin; $i < ($bengin + $len); $i++) {
  470. isset($array[$i]) && $array[$i] = "*";
  471. }
  472. $string = implode("", array_reverse($array));
  473. break;
  474. case 2 :
  475. $array = explode($glue, $string);
  476. $array[0] = self::hideStr($array[0], $bengin, $len, 1);
  477. $string = implode($glue, $array);
  478. break;
  479. case 3 :
  480. $array = explode($glue, $string);
  481. $array[1] = self::hideStr($array[1], $bengin, $len, 0);
  482. $string = implode($glue, $array);
  483. break;
  484. case 4 :
  485. $left = $bengin;
  486. $right = $len;
  487. $tem = array();
  488. for ($i = 0; $i < ($length - $right); $i++) {
  489. if (isset($array[$i])) {
  490. $tem[] = $i >= $left ? "*" : $array[$i];
  491. }
  492. }
  493. $array = array_chunk(array_reverse($array), $right);
  494. $array = array_reverse($array[0]);
  495. for ($i = 0; $i < $right; $i++) {
  496. $tem[] = $array[$i];
  497. }
  498. $string = implode("", $tem);
  499. break;
  500. }
  501. return $string;
  502. }
  503. /**
  504. * 匹配2个之间字符的字符串
  505. *
  506. * @param $str
  507. * @param string $start
  508. * @param string $end
  509. * @return array
  510. */
  511. public static function matchStr($str, $start = '{', $end = '}')
  512. {
  513. $strPattern = "/(?<=".$start.")[^".$end."]+/";
  514. $arrMatches = [];
  515. preg_match_all($strPattern, $str, $arrMatches);
  516. return $arrMatches[0] ?? [];
  517. }
  518. }
粤ICP备19079148号