类 yii\helpers\BaseStringHelper
继承关系 | yii\helpers\BaseStringHelper |
---|---|
子类 | yii\helpers\StringHelper |
可用版本 | 2.0 |
源代码 | https://github.com/yiisoft/yii2/blob/master/framework/helpers/BaseStringHelper.php |
BaseStringHelper 为 yii\helpers\StringHelper 提供具体实现。
不要使用 BaseStringHelper。请使用 yii\helpers\StringHelper 代替。
公共方法
方法详情
解码“带 URL 和文件名安全字母表的 Base 64 编码”(RFC 4648)。
public static string base64UrlDecode ( $input ) | ||
$input | 字符串 |
编码后的字符串。 |
返回值 | 字符串 |
解码后的字符串。 |
---|
public static function base64UrlDecode($input)
{
return base64_decode(strtr($input, '-_', '+/'));
}
将字符串编码为“带 URL 和文件名安全字母表的 Base 64 编码”(RFC 4648)。
注意:返回字符串的末尾可能存在 Base 64 填充
=
。=
对 URL 编码不透明。
public static string base64UrlEncode ( $input ) | ||
$input | 字符串 |
要编码的字符串。 |
返回值 | 字符串 |
编码后的字符串。 |
---|
public static function base64UrlEncode($input)
{
return strtr(base64_encode($input), '+/', '-_');
}
返回路径的尾部名称组件。
此方法类似于 php 函数 basename()
,但它将 \ 和 / 都视为目录分隔符,独立于操作系统。此方法主要是为了处理 php 命名空间而创建的。在处理真实文件路径时,php 的 basename()
应该可以很好地为您工作。注意:此方法不知道实际的文件系统或路径组件,例如“..”。
public static string basename ( $path, $suffix = '' ) | ||
$path | 字符串 |
路径字符串。 |
$suffix | 字符串 |
如果名称组件以后缀结尾,则此后缀也将被切掉。 |
返回值 | 字符串 |
给定路径的尾部名称组件。 |
---|
public static function basename($path, $suffix = '')
{
$path = (string)$path;
$len = mb_strlen($suffix);
if ($len > 0 && mb_substr($path, -$len) === $suffix) {
$path = mb_substr($path, 0, -$len);
}
$path = rtrim(str_replace('\\', '/', $path), '/');
$pos = mb_strrpos($path, '/');
if ($pos !== false) {
return mb_substr($path, $pos + 1);
}
return $path;
}
返回给定字符串中的字节数。
此方法通过使用 mb_strlen()
确保字符串被视为字节数组。
public static integer byteLength ( $string ) | ||
$string | 字符串 |
正在测量长度的字符串 |
返回值 | 整数 |
给定字符串中的字节数。 |
---|
public static function byteLength($string)
{
return mb_strlen((string)$string, '8bit');
}
返回由开始和长度参数指定的字符串部分。
此方法通过使用 mb_substr()
确保字符串被视为字节数组。
public static 字符串 byteSubstr ( $string, $start, $length = null ) | ||
$string | 字符串 |
输入字符串。必须为一个或多个字符。 |
$start | 整数 |
起始位置 |
$length | 整数|空 |
所需的片段长度。如果未指定或为 |
返回值 | 字符串 |
提取的字符串部分,或在失败或空字符串时返回FALSE。 |
---|
public static function byteSubstr($string, $start, $length = null)
{
if ($length === null) {
$length = static::byteLength($string);
}
return mb_substr((string)$string, $start, $length, '8bit');
}
计算字符串中的单词数。
public static 整数 countWords ( $string ) | ||
$string | 字符串 |
要计算的文本 |
public static function countWords($string)
{
return count(preg_split('/\s+/u', $string, 0, PREG_SPLIT_NO_EMPTY));
}
返回父目录的路径。
此方法类似于dirname()
,但它将\和/都视为目录分隔符,与操作系统无关。
public static 字符串 dirname ( $path ) | ||
$path | 字符串 |
路径字符串。 |
返回值 | 字符串 |
父目录的路径。 |
---|
public static function dirname($path)
{
$normalizedPath = rtrim(
str_replace('\\', '/', (string)$path),
'/'
);
$separatorPosition = mb_strrpos($normalizedPath, '/');
if ($separatorPosition !== false) {
return mb_substr($path, 0, $separatorPosition);
}
return '';
}
检查给定字符串是否以指定的子字符串结尾。二进制和多字节安全。
public static 布尔值 endsWith ( $string, $with, $caseSensitive = true ) | ||
$string | 字符串 |
要检查的输入字符串 |
$with | 字符串 |
在 |
$caseSensitive | 布尔值 |
区分大小写的搜索。默认为true。当启用区分大小写时, |
返回值 | 布尔值 |
如果第一个输入以第二个输入结尾,则返回true,否则返回false |
---|
public static function endsWith($string, $with, $caseSensitive = true)
{
$string = (string)$string;
$with = (string)$with;
if (!$bytes = static::byteLength($with)) {
return true;
}
if ($caseSensitive) {
// Warning check, see https://www.php.ac.cn/substr-compare#refsect1-function.substr-compare-returnvalues
if (static::byteLength($string) < $bytes) {
return false;
}
return substr_compare($string, $with, -$bytes, $bytes) === 0;
}
$encoding = Yii::$app ? Yii::$app->charset : 'UTF-8';
$string = static::byteSubstr($string, -$bytes);
return mb_strtolower($string, $encoding) === mb_strtolower($with, $encoding);
}
将字符串分解成数组,可选地修剪值并跳过空值。
public static 数组 explode ( $string, $delimiter = ',', $trim = true, $skipEmpty = false ) | ||
$string | 字符串 |
要分解的字符串。 |
$delimiter | 字符串 |
分隔符。默认为','。 |
$trim | 混合类型 |
是否修剪每个元素。可以是
|
$skipEmpty | 布尔值 |
是否跳过分隔符之间的空字符串。默认为false。 |
public static function explode($string, $delimiter = ',', $trim = true, $skipEmpty = false)
{
$result = explode($delimiter, $string);
if ($trim !== false) {
if ($trim === true) {
$trim = 'trim';
} elseif (!is_callable($trim)) {
$trim = function ($v) use ($trim) {
return trim($v, $trim);
};
}
$result = array_map($trim, $result);
}
if ($skipEmpty) {
// Wrapped with array_values to make array keys sequential after empty values removing
$result = array_values(array_filter($result, function ($value) {
return $value !== '';
}));
}
return $result;
}
返回字符串中位于开始字符串的第一次出现和之后结束字符串的最后一次出现之间的部分。
public static 字符串|空 findBetween ( $string, $start, $end ) | ||
$string | 字符串 |
输入字符串。 |
$start | 字符串 |
标记要提取的部分开始的字符串。 |
$end | 字符串 |
标记要提取的部分结束的字符串。 |
返回值 | 字符串|空 |
start第一次出现和end最后一次出现之间的字符串部分,如果start或end都找不到,则为null。 |
---|
public static function findBetween($string, $start, $end)
{
$startPos = mb_strpos($string, $start);
if ($startPos === false) {
return null;
}
$startPos += mb_strlen($start);
$endPos = mb_strrpos($string, $end, $startPos);
if ($endPos === false) {
return null;
}
return mb_substr($string, $startPos, $endPos - $startPos);
}
安全地将浮点数转换为字符串,独立于当前区域设置。
小数分隔符将始终为.
。
public static 字符串 floatToString ( $number ) | ||
$number | 浮点数|整数 |
浮点数或整数。 |
返回值 | 字符串 |
数字的字符串表示形式。 |
---|
public static function floatToString($number)
{
// . and , are the only decimal separators known in ICU data,
// so its safe to call str_replace here
return str_replace(',', '.', (string) $number);
}
使用重复的字符屏蔽字符串的一部分。
此方法支持多字节。
public static 字符串 mask ( $string, $start, $length, $mask = '*' ) | ||
$string | 字符串 |
输入字符串。 |
$start | 整数 |
从哪里开始掩码的起始位置。这可以是正整数或负整数。正值从开头算起,负值从字符串末尾算起。 |
$length | 整数 |
要掩码的部分的长度。掩码将从$start位置开始,持续$length个字符。 |
$mask | 字符串 |
用于掩码的字符。默认为'*'。 |
返回值 | 字符串 |
掩码后的字符串。 |
---|
public static function mask($string, $start, $length, $mask = '*')
{
$strLength = mb_strlen($string, 'UTF-8');
// Return original string if start position is out of bounds
if ($start >= $strLength || $start < -$strLength) {
return $string;
}
$masked = mb_substr($string, 0, $start, 'UTF-8');
$masked .= str_repeat($mask, abs($length));
$masked .= mb_substr($string, $start + abs($length), null, 'UTF-8');
return $masked;
}
检查传递的字符串是否与给定的 shell 通配符模式匹配。
此函数模拟fnmatch(),该函数在某些环境中可能不可用,使用PCRE。
public static 布尔值 matchWildcard ( $pattern, $string, $options = [] ) | ||
$pattern | 字符串 |
Shell通配符模式。 |
$string | 字符串 |
被测试的字符串。 |
$options | 数组 |
匹配选项。有效选项为
|
返回值 | 布尔值 |
字符串是否匹配模式。 |
---|
public static function matchWildcard($pattern, $string, $options = [])
{
if ($pattern === '*' && empty($options['filePath'])) {
return true;
}
$replacements = [
'\\\\\\\\' => '\\\\',
'\\\\\\*' => '[*]',
'\\\\\\?' => '[?]',
'\*' => '.*',
'\?' => '.',
'\[\!' => '[^',
'\[' => '[',
'\]' => ']',
'\-' => '-',
];
if (isset($options['escape']) && !$options['escape']) {
unset($replacements['\\\\\\\\']);
unset($replacements['\\\\\\*']);
unset($replacements['\\\\\\?']);
}
if (!empty($options['filePath'])) {
$replacements['\*'] = '[^/\\\\]*';
$replacements['\?'] = '[^/\\\\]';
}
$pattern = strtr(preg_quote($pattern, '#'), $replacements);
$pattern = '#^' . $pattern . '$#us';
if (isset($options['caseSensitive']) && !$options['caseSensitive']) {
$pattern .= 'i';
}
return preg_match($pattern, (string)$string) === 1;
}
此方法为内置 PHP 函数 ucfirst()
提供了 Unicode 安全的实现。
public static 字符串 mb_ucfirst ( $string, $encoding = 'UTF-8' ) | ||
$string | 字符串 |
要处理的字符串 |
$encoding | 字符串 |
可选,默认为“UTF-8” |
public static function mb_ucfirst($string, $encoding = 'UTF-8')
{
$firstChar = mb_substr((string)$string, 0, 1, $encoding);
$rest = mb_substr((string)$string, 1, null, $encoding);
return mb_strtoupper($firstChar, $encoding) . $rest;
}
此方法为内置 PHP 函数 ucwords()
提供了 Unicode 安全的实现。
public static 字符串 mb_ucwords ( $string, $encoding = 'UTF-8' ) | ||
$string | 字符串 |
要处理的字符串 |
$encoding | 字符串 |
可选,默认为“UTF-8” |
public static function mb_ucwords($string, $encoding = 'UTF-8')
{
$string = (string) $string;
if (empty($string)) {
return $string;
}
$parts = preg_split('/(\s+\W+\s+|^\W+\s+|\s+)/u', $string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
$ucfirstEven = trim(mb_substr($parts[0], -1, 1, $encoding)) === '';
foreach ($parts as $key => $value) {
$isEven = (bool)($key % 2);
if ($ucfirstEven === $isEven) {
$parts[$key] = static::mb_ucfirst($value, $encoding);
}
}
return implode('', $parts);
}
返回数字值的字符串表示形式,其中用点替换逗号,如果当前区域设置的小数点是逗号。
public static 字符串 normalizeNumber ( $value ) | ||
$value | 整数|浮点数|字符串 |
要规范化的值。 |
public static function normalizeNumber($value)
{
$value = (string) $value;
$localeInfo = localeconv();
$decimalSeparator = isset($localeInfo['decimal_point']) ? $localeInfo['decimal_point'] : null;
if ($decimalSeparator !== null && $decimalSeparator !== '.') {
$value = str_replace($decimalSeparator, '.', $value);
}
return $value;
}
检查给定字符串是否以指定的子字符串开头。二进制和多字节安全。
public static 布尔值 startsWith ( $string, $with, $caseSensitive = true ) | ||
$string | 字符串 |
输入字符串 |
$with | 字符串 |
在 $string 中搜索的部分 |
$caseSensitive | 布尔值 |
区分大小写的搜索。默认为 true。启用区分大小写时, |
返回值 | 布尔值 |
如果第一个输入以第二个输入开头,则返回 true,否则返回 false |
---|
public static function startsWith($string, $with, $caseSensitive = true)
{
$string = (string)$string;
$with = (string)$with;
if (!$bytes = static::byteLength($with)) {
return true;
}
if ($caseSensitive) {
return strncmp($string, $with, $bytes) === 0;
}
$encoding = Yii::$app ? Yii::$app->charset : 'UTF-8';
$string = static::byteSubstr($string, 0, $bytes);
return mb_strtolower($string, $encoding) === mb_strtolower($with, $encoding);
}
将字符串截断到指定的字符数。
为了截断到精确长度,必须将 $suffix 字符长度计入 $length。例如,要获得一个正好 255 个字符长的字符串,其中 $suffix 为 3 个字符的 ...
,则必须使用 StringHelper::truncate($string, 252, '...')
来确保您随后拥有 255 个字符长的字符串。
public static 字符串 truncate ( $string, $length, $suffix = '...', $encoding = null, $asHtml = false ) | ||
$string | 字符串 |
要截断的字符串。 |
$length | 整数 |
要包含在截断字符串中的原始字符串的字符数。 |
$suffix | 字符串 |
要附加到截断字符串末尾的字符串。 |
$encoding | 字符串|空 |
要使用的字符集,默认为应用程序当前使用的字符集。 |
$asHtml | 布尔值 |
是否将要截断的字符串视为 HTML 并保留正确的 HTML 标签。此参数自版本 2.0.1 起可用。 |
返回值 | 字符串 |
截断后的字符串。 |
---|
public static function truncate($string, $length, $suffix = '...', $encoding = null, $asHtml = false)
{
$string = (string)$string;
if ($encoding === null) {
$encoding = Yii::$app ? Yii::$app->charset : 'UTF-8';
}
if ($asHtml) {
return static::truncateHtml($string, $length, $suffix, $encoding);
}
if (mb_strlen($string, $encoding) > $length) {
return rtrim(mb_substr($string, 0, $length, $encoding)) . $suffix;
}
return $string;
}
截断字符串同时保留 HTML。
protected static 字符串 truncateHtml ( $string, $count, $suffix, $encoding = false ) | ||
$string | 字符串 |
要截断的字符串 |
$count | 整数 |
计数器 |
$suffix | 字符串 |
要附加到截断字符串末尾的字符串。 |
$encoding | 字符串|布尔值 |
编码标志或字符集。 |
protected static function truncateHtml($string, $count, $suffix, $encoding = false)
{
$config = \HTMLPurifier_Config::create(null);
if (Yii::$app !== null) {
$config->set('Cache.SerializerPath', Yii::$app->getRuntimePath());
}
$lexer = \HTMLPurifier_Lexer::create($config);
$tokens = $lexer->tokenizeHTML($string, $config, new \HTMLPurifier_Context());
$openTokens = [];
$totalCount = 0;
$depth = 0;
$truncated = [];
foreach ($tokens as $token) {
if ($token instanceof \HTMLPurifier_Token_Start) { //Tag begins
$openTokens[$depth] = $token->name;
$truncated[] = $token;
++$depth;
} elseif ($token instanceof \HTMLPurifier_Token_Text && $totalCount <= $count) { //Text
if (false === $encoding) {
preg_match('/^(\s*)/um', $token->data, $prefixSpace) ?: $prefixSpace = ['', ''];
$token->data = $prefixSpace[1] . self::truncateWords(ltrim($token->data), $count - $totalCount, '');
$currentCount = self::countWords($token->data);
} else {
$token->data = self::truncate($token->data, $count - $totalCount, '', $encoding);
$currentCount = mb_strlen($token->data, $encoding);
}
$totalCount += $currentCount;
$truncated[] = $token;
} elseif ($token instanceof \HTMLPurifier_Token_End) { //Tag ends
if ($token->name === $openTokens[$depth - 1]) {
--$depth;
unset($openTokens[$depth]);
$truncated[] = $token;
}
} elseif ($token instanceof \HTMLPurifier_Token_Empty) { //Self contained tags, i.e. <img/> etc.
$truncated[] = $token;
}
if ($totalCount >= $count) {
if (0 < count($openTokens)) {
krsort($openTokens);
foreach ($openTokens as $name) {
$truncated[] = new \HTMLPurifier_Token_End($name);
}
}
break;
}
}
$context = new \HTMLPurifier_Context();
$generator = new \HTMLPurifier_Generator($config, $context);
return $generator->generateFromTokens($truncated) . ($totalCount >= $count ? $suffix : '');
}
将字符串截断到指定的单词数。
public static 字符串 truncateWords ( $string, $count, $suffix = '...', $asHtml = false ) | ||
$string | 字符串 |
要截断的字符串。 |
$count | 整数 |
要包含在截断字符串中的原始字符串的单词数。 |
$suffix | 字符串 |
要附加到截断字符串末尾的字符串。 |
$asHtml | 布尔值 |
是否将要截断的字符串视为 HTML 并保留正确的 HTML 标签。此参数自版本 2.0.1 起可用。 |
返回值 | 字符串 |
截断后的字符串。 |
---|
public static function truncateWords($string, $count, $suffix = '...', $asHtml = false)
{
if ($asHtml) {
return static::truncateHtml($string, $count, $suffix);
}
$words = preg_split('/(\s+)/u', trim($string), 0, PREG_SPLIT_DELIM_CAPTURE);
if (count($words) / 2 > $count) {
return implode('', array_slice($words, 0, ($count * 2) - 1)) . $suffix;
}
return $string;
}
注册 或 登录 以发表评论。