选择语言 :

 Core_UTF8::substr

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 ] )
author
Chris Smith chris@jalakai.co.uk
uses
IS_MBSTRING
Kohana::$charset

参数列表

参数 类型 描述 默认值
$str string Input string
$offset integer Offset
$length integer Length limit null
返回值
  • string
File: ./core/classes/utf8.class.php
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];
}