<?php /* * This file is part of the overtrue/wechat. * * (c) overtrue <i@overtrue.me> * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ /** * Str.php. * * @author overtrue <i@overtrue.me> * @copyright 2015 overtrue <i@overtrue.me> * * @see https://github.com/overtrue * @see http://overtrue.me */ namespace EasyWeChat\Support; use EasyWeChat\Core\Exceptions\RuntimeException; class Str { /** * The cache of snake-cased words. * * @var array */ protected static $snakeCache = []; /** * The cache of camel-cased words. * * @var array */ protected static $camelCache = []; /** * The cache of studly-cased words. * * @var array */ protected static $studlyCache = []; /** * Convert a value to camel case. * * @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)); } /** * Generate a more truly "random" alpha-numeric string. * * @param int $length * * @return string * * @throws \RuntimeException */ public static function random($length = 16) { $string = ''; while (($len = strlen($string)) < $length) { $size = $length - $len; $bytes = static::randomBytes($size); $string .= substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $size); } return $string; } /** * Generate a more truly "random" bytes. * * @param int $length * * @return string * * @throws RuntimeException */ public static function randomBytes($length = 16) { if (function_exists('random_bytes')) { $bytes = random_bytes($length); } elseif (function_exists('openssl_random_pseudo_bytes')) { $bytes = openssl_random_pseudo_bytes($length, $strong); if (false === $bytes || false === $strong) { throw new RuntimeException('Unable to generate random string.'); } } else { throw new RuntimeException('OpenSSL extension is required for PHP 5 users.'); } return $bytes; } /** * Generate a "random" alpha-numeric string. * * Should not be considered sufficient for cryptography, etc. * * @param int $length * * @return string */ public static function quickRandom($length = 16) { $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; return substr(str_shuffle(str_repeat($pool, $length)), 0, $length); } /** * Convert the given string to upper-case. * * @param string $value * * @return string */ public static function upper($value) { return mb_strtoupper($value); } /** * Convert the given string to title case. * * @param string $value * * @return string */ public static function title($value) { return mb_convert_case($value, MB_CASE_TITLE, 'UTF-8'); } /** * Convert a string to snake case. * * @param string $value * @param string $delimiter * * @return string */ public static function snake($value, $delimiter = '_') { $key = $value.$delimiter; if (isset(static::$snakeCache[$key])) { return static::$snakeCache[$key]; } if (!ctype_lower($value)) { $value = strtolower(preg_replace('/(.)(?=[A-Z])/', '$1'.$delimiter, $value)); } return static::$snakeCache[$key] = $value; } /** * Convert a value to studly caps case. * * @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); } }