Symfony\Polyfill\Mbstring
Mbstring::mb_trim_invalid_utf8
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() 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');
}