| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- <?php
- namespace app\extra\tools;
- class CodeExtend
- {
- /**
- * 数组转XML内容
- * @param array $data
- * @return string
- */
- public static function arr2xml($data)
- {
- return "<xml>" . self::_arr2xml($data) . "</xml>";
- }
- /**
- * 解析XML内容到数组
- * @param string $xml
- * @return array
- */
- public static function xml2arr($xml)
- {
- // 使用simplexml_load_string并禁用外部实体加载
- $xmlObject = simplexml_load_string(
- $xml,
- 'SimpleXMLElement',
- LIBXML_NOCDATA | LIBXML_NOBLANKS | LIBXML_NOENT
- );
- if ($xmlObject === false) {
- throw new \RuntimeException("Failed to parse XML");
- }
- return json_decode(json_encode($xmlObject), true);
- }
- /**
- * XML内容生成
- * @param array $data 数据
- * @param string $content
- * @return string
- */
- private static function _arr2xml($data, $content = '')
- {
- foreach ($data as $key => $val) {
- is_numeric($key) && $key = 'item';
- $content .= "<{$key}>";
- if (is_array($val) || is_object($val)) {
- $content .= self::_arr2xml($val);
- } elseif (is_string($val)) {
- $content .= '<![CDATA[' . preg_replace("/[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f]/", '', $val) . ']]>';
- } else {
- $content .= $val;
- }
- $content .= "</{$key}>";
- }
- return $content;
- }
- public static function createNoncestr($length = 32, $str = "")
- {
- $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
- for ($i = 0; $i < $length; $i++) {
- $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
- }
- return $str;
- }
- /**
- * 生成随机编码
- * @param integer $size 编码长度
- * @param integer $type 编码类型(1纯数字,2纯字母,3数字字母)
- * @param string $prefix 编码前缀
- * @return string
- */
- public static function random(int $size = 10, int $type = 1, string $prefix = ''): string
- {
- $numbs = '0123456789';
- $chars = 'abcdefghijklmnopqrstuvwxyz';
- if ($type === 1) $chars = $numbs;
- if ($type === 3) $chars = "{$numbs}{$chars}";
- $code = $prefix . $chars[rand(1, strlen($chars) - 1)];
- while (strlen($code) < $size) $code .= $chars[rand(0, strlen($chars) - 1)];
- return $code;
- }
- /**
- * 生成日期编码
- * @param integer $size 编码长度
- * @param string $prefix 编码前缀
- * @return string
- */
- public static function uniqidDate(int $size = 16, string $prefix = ''): string
- {
- if ($size < 14) $size = 14;
- $code = $prefix . date('Ymd') . (date('H') + date('i')) . date('s');
- while (strlen($code) < $size) $code .= rand(0, 9);
- return $code;
- }
- /**
- * 生成数字编码
- * @param integer $size 编码长度
- * @param string $prefix 编码前缀
- * @return string
- */
- public static function uniqidNumber(int $size = 12, string $prefix = ''): string
- {
- $time = strval(time());
- if ($size < 10) $size = 10;
- $code = $prefix . (intval($time[0]) + intval($time[1])) . substr($time, 2) . rand(0, 9);
- while (strlen($code) < $size) $code .= rand(0, 9);
- return $code;
- }
- /**
- * 文本转码
- * @param string $text 文本内容
- * @param string $target 目标编码
- * @return string
- */
- public static function text2utf8(string $text, string $target = 'UTF-8'): string
- {
- [$first2, $first4] = [substr($text, 0, 2), substr($text, 0, 4)];
- if ($first4 === chr(0x00) . chr(0x00) . chr(0xFE) . chr(0xFF)) $ft = 'UTF-32BE';
- elseif ($first4 === chr(0xFF) . chr(0xFE) . chr(0x00) . chr(0x00)) $ft = 'UTF-32LE';
- elseif ($first2 === chr(0xFE) . chr(0xFF)) $ft = 'UTF-16BE';
- elseif ($first2 === chr(0xFF) . chr(0xFE)) $ft = 'UTF-16LE';
- return mb_convert_encoding($text, $target, $ft ?? mb_detect_encoding($text));
- }
- /**
- * 数据解密处理
- * @param mixed $data 加密数据
- * @param string $skey 安全密钥
- * @return string
- */
- public static function encrypt($data, string $skey): string
- {
- $iv = static::random(16, 3);
- $value = openssl_encrypt(serialize($data), 'AES-256-CBC', $skey, 0, $iv);
- return static::enSafe64(json_encode(['iv' => $iv, 'value' => $value]));
- }
- /**
- * 数据加密处理
- * @param string $data 解密数据
- * @param string $skey 安全密钥
- * @return mixed
- */
- public static function decrypt(string $data, string $skey)
- {
- $attr = json_decode(static::deSafe64($data), true);
- return unserialize(openssl_decrypt($attr['value'], 'AES-256-CBC', $skey, 0, $attr['iv']));
- }
- /**
- * Base64Url 安全编码
- * @param string $text 待加密文本
- * @return string
- */
- public static function enSafe64(string $text): string
- {
- return rtrim(strtr(base64_encode($text), '+/', '-_'), '=');
- }
- /**
- * Base64Url 安全解码
- * @param string $text 待解密文本
- * @return string
- */
- public static function deSafe64(string $text): string
- {
- return base64_decode(str_pad(strtr($text, '-_', '+/'), strlen($text) % 4, '='));
- }
- /**
- * 压缩数据对象
- * @param mixed $data
- * @return string
- */
- public static function enzip($data): string
- {
- return static::enSafe64(gzcompress(serialize($data)));
- }
- /**
- * 解压数据对象
- * @param string $string
- * @return mixed
- */
- public static function dezip(string $string)
- {
- return unserialize(gzuncompress(static::deSafe64($string)));
- }
- }
|