/
v.bolshakov
/
AIEcosystem-Testing
Обзор
Документация
Войти
/
v.bolshakov
/
AIEcosystem-Testing
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
dev
common/helpers/utf8/substr.php
67 строк
2 KB
Developer
Initial commit
03 авг 2026, 17:43
03 авг 2026, 17:43
7433917
Код
Авторство
О чём код?
<?php use common\helpers\Utf8Helper; /** * Utf8Helper::substr */ function _substr($str, $offset, $length = null) { if (Utf8Helper::isAscii($str)) { return ($length === null) ? substr($str, $offset) : substr($str, $offset, $length); } // Normalize params $str = (string)$str; $strlen = Utf8Helper::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]; }