Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. Grapheme.php

function Grapheme::grapheme_extract

File

vendor/symfony/polyfill-intl-grapheme/Grapheme.php, line 45

Class

Grapheme
Partial intl implementation in pure PHP.

Namespace

Symfony\Polyfill\Intl\Grapheme

Code

public static function grapheme_extract($s, $size, $type = \GRAPHEME_EXTR_COUNT, $start = 0, &$next = 0) {
    if (0 > $start) {
        $start = \strlen($s) + $start;
    }
    if (!\is_scalar($s)) {
        $hasError = false;
        set_error_handler(function () use (&$hasError) {
            $hasError = true;
        });
        $next = substr($s, $start);
        restore_error_handler();
        if ($hasError) {
            substr($s, $start);
            $s = '';
        }
        else {
            $s = $next;
        }
    }
    else {
        $s = substr($s, $start);
    }
    $size = (int) $size;
    $type = (int) $type;
    $start = (int) $start;
    if (\GRAPHEME_EXTR_COUNT !== $type && \GRAPHEME_EXTR_MAXBYTES !== $type && \GRAPHEME_EXTR_MAXCHARS !== $type) {
        if (80000 > \PHP_VERSION_ID) {
            return false;
        }
        throw new \ValueError('grapheme_extract(): Argument #3 ($type) must be one of GRAPHEME_EXTR_COUNT, GRAPHEME_EXTR_MAXBYTES, or GRAPHEME_EXTR_MAXCHARS');
    }
    if (!isset($s[0]) || 0 > $size || 0 > $start) {
        return false;
    }
    if (0 === $size) {
        return '';
    }
    $next = $start;
    $s = preg_split('/(' . SYMFONY_GRAPHEME_CLUSTER_RX . ')/u', "\r\n" . $s, $size + 1, \PREG_SPLIT_NO_EMPTY | \PREG_SPLIT_DELIM_CAPTURE);
    if (!isset($s[1])) {
        return false;
    }
    $i = 1;
    $ret = '';
    do {
        if (\GRAPHEME_EXTR_COUNT === $type) {
            --$size;
        }
        elseif (\GRAPHEME_EXTR_MAXBYTES === $type) {
            $size -= \strlen($s[$i]);
        }
        else {
            $size -= iconv_strlen($s[$i], 'UTF-8//IGNORE');
        }
        if ($size >= 0) {
            $ret .= $s[$i];
        }
    } while (isset($s[++$i]) && $size > 0);
    $next += \strlen($ret);
    return $ret;
}

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal