Symfony\Polyfill\Mbstring

Mbstring::mb_trim_invalid_utf8 │ private static │ CF7 1.0

Trims ill-formed UTF-8 like mbstring: each maximal subpart of an ill-formed sequence counts as one character, and the string is returned as is when nothing is trimmed, else re-encoded with the substitute character.

Метод класса: Mbstring{}

Хуков нет.

Возвращает

null. Ничего (null).

Использование

$result = Mbstring::mb_trim_invalid_utf8( $string, ?string $characters, $function ): string;
$string(строка) (обязательный)
.
?string $characters(обязательный)
.
$function(строка) (обязательный)
.

Код Mbstring::mb_trim_invalid_utf8() CF7 6.2.4.1

private static function mb_trim_invalid_utf8(string $string, ?string $characters, string $function): string
{
    $regex = self::UTF8_CHAR_REGEX;

    // Ill-formed sequences leave group 1 empty: they are trimmed when $characters has one too
    preg_match_all($regex, $characters ?? "\0 \f\n\r\t\v\u{00A0}\u{1680}\u{2000}\u{2001}\u{2002}\u{2003}\u{2004}\u{2005}\u{2006}\u{2007}\u{2008}\u{2009}\u{200A}\u{2028}\u{2029}\u{202F}\u{205F}\u{3000}\u{0085}\u{180E}", $m);
    $trimmed = array_flip($m[1]);

    $start = 0;
    $end = \strlen($string);

    while ('mb_rtrim' !== $function && $start < $end && preg_match($regex, $string, $m, 0, $start) && isset($trimmed[$m[1] ?? ''])) {
        $start += \strlen($m[0]);
    }

    while ('mb_ltrim' !== $function && $start < $end) {
        // Characters are at most 4 bytes long, and only continuation bytes don't start one
        for ($i = $end - 1; $i > $start && $i > $end - 4 && 0x80 === (\ord($string[$i]) & 0xC0); --$i) {
        }

        preg_match_all($regex, substr($string, $i, $end - $i), $m);

        if (!isset($trimmed[end($m[1])])) {
            break;
        }

        $end -= \strlen(end($m[0]));
    }

    if (0 === $start && \strlen($string) === $end) {
        return $string;
    }

    $string = substr($string, $start, $end - $start);

    return 'none' === mb_substitute_character() ? self::scrubUtf8($string) : mb_convert_encoding($string, 'UTF-8', 'UTF-8');
}