Returns part of a UTF-8 string. This is a UTF8-aware version of substr.
$sub = UTF8::substr($str, $offset);
string Core_UTF8::substr( string $str , integer $offset [, integer $length = null ] )
参数列表
参数 类型 描述 默认值 $str
string
Input string $offset
integer
Offset $length
integer
Length limit null
string
public static function substr($str, $offset, $length = null)
{
if (IS_MBSTRING)return ($length === null) ? mb_substr($str, $offset, mb_strlen($str), Core::$charset) : mb_substr($str, $offset, $length, Core::$charset);
if ( UTF8::is_ascii($str) ) return ($length === null) ? substr($str, $offset) : substr($str, $offset, $length);
// Normalize params
$str = (string)$str;
$strlen = UTF8::strlen($str);
$offset = (int)($offset < 0) ? max(0, $strlen + $offset) : $offset; // Normalize to positive offset
$length = ($length === null) ? null : (int)$length;
// Impossible
if ( $length === 0 or $offset >= $strlen or ($length < 0 and $length <= $offset - $strlen) ) return '';
// Whole string
if ( $offset == 0 and ($length === null or $length >= $strlen) ) return $str;
// Build regex
$regex = '^';
// Create an offset expression
if ( $offset > 0 )
{
// PCRE repeating quantifiers must be less than 65536, so repeat when necessary
$x = (int)($offset / 65535);
$y = (int)($offset % 65535);
$regex .= ($x == 0) ? '' : '(?:.{65535}){' . $x . '}';
$regex .= ($y == 0) ? '' : '.{' . $y . '}';
}
// Create a length expression
if ( $length === null )
{
$regex .= '(.*)'; // No length set, grab it all
}
// Find length from the left (positive length)
elseif ( $length > 0 )
{
// Reduce length so that it can't go beyond the end of the string
$length = min($strlen - $offset, $length);
$x = (int)($length / 65535);
$y = (int)($length % 65535);
$regex .= '(';
$regex .= ($x == 0) ? '' : '(?:.{65535}){' . $x . '}';
$regex .= '.{' . $y . '})';
}
// Find length from the right (negative length)
else
{
$x = (int)(- $length / 65535);
$y = (int)(- $length % 65535);
$regex .= '(.*)';
$regex .= ($x == 0) ? '' : '(?:.{65535}){' . $x . '}';
$regex .= '.{' . $y . '}';
}
preg_match('/' . $regex . '/us', $str, $matches);
return $matches[1];
}