<?php

// lib/strings.php
// Kleine String-Helper ohne harte Abhängigkeit von mbstring.
// Ziel: Längenvalidierung möglichst „zeichenbasiert“ und UTF-8-tauglich.

/**
 * Liefert die Länge eines Strings in Zeichen (nicht Bytes), wenn möglich.
 *
 * Priorität:
 * 1) mb_strlen (mbstring)
 * 2) grapheme_strlen (intl)
 * 3) UTF-8 Codepoint-Zählung via PCRE
 * 4) Fallback: strlen (Bytes)
 */

function str_length(string $s): int
{
    if (function_exists('mb_strlen'))
    {
        return (int)mb_strlen($s, 'UTF-8');
    }

    if (function_exists('grapheme_strlen'))
    {
        $len = grapheme_strlen($s);

        if ($len !== false)
        {
            return (int)$len;
        }
    }

    // UTF-8 Codepoints zählen (best-effort ohne Extensions)
    $m = [];
    $ok = @preg_match_all('/./us', $s, $m);

    if ($ok !== false)
    {
        return (int)$ok;
    }

    // Letzter Fallback (Bytes)
    return strlen($s);
}
