варианты написания (без пробелов, в нижнем регистре). */ private const VARIANTS = [ self::UNIT => ['штука', 'штуки', 'штук', 'шт', 'pc', 'pce', 'pcs', 'nmb'], 'gram' => ['грамм', 'граммы', 'г', 'гр', 'g', 'grm'], 'kilogram' => ['килограмм', 'килограммы', 'кг', 'kg', 'kgm'], 'ton' => ['тонна', 'тонны', 'т', 't', 'tne'], 'centimeter' => ['сантиметр', 'см', 'cm', 'cmt'], 'decimeter' => ['дециметр', 'дм', 'dm', 'dmt'], 'meter' => ['метр', 'метры', 'м', 'm', 'mtr', 'пм', 'пог.м'], 'square_centimeter' => ['квадратныйсантиметр', 'кв.см', 'см2', 'cm2', 'cmk'], 'square_decimeter' => ['квадратныйдециметр', 'кв.дм', 'дм2', 'dm2', 'dmk'], 'square_meter' => ['квадратныйметр', 'кв.м', 'м2', 'm2', 'mtk'], 'milliliter' => ['миллилитр', 'мл', 'ml', 'mlt'], 'liter' => ['литр', 'литры', 'л', 'l', 'ltr'], 'cubic_meter' => ['кубическийметр', 'куб.м', 'м3', 'm3', 'mtq'], 'kilowatt_hour' => ['киловаттчас', 'квт*ч', 'квт-ч', 'квтч', 'kwh'], 'gigacalorie' => ['гигакалория', 'гкал', 'гигакал'], 'day' => ['сутки', 'сут', 'день', 'дн', 'd', 'day'], 'hour' => ['час', 'ч', 'h', 'hur'], 'minute' => ['минута', 'мин', 'min'], 'second' => ['секунда', 'сек', 'с', 's', 'sec'], 'kilobyte' => ['килобайт', 'кбайт', 'кб', 'kib', 'киб', 'kb'], 'megabyte' => ['мегабайт', 'мбайт', 'мб', 'mib', 'миб', 'mb'], 'gigabyte' => ['гигабайт', 'гбайт', 'гб', 'gib', 'гиб', 'gb'], 'terabyte' => ['терабайт', 'тбайт', 'тб', 'tib', 'тиб', 'tb'], ]; private function __construct() {} /** * @param string $unit единица товара в UTF-8 * @param Closure(string): string $toUtf8 литералы модуля -> UTF-8 */ public static function fromUnit(string $unit, Closure $toUtf8): string { // Пробелы не значимы («кв. м»), точка на конце — сокращение («шт.»). $unit = rtrim((string) preg_replace('/\s+/u', '', $unit), '.'); if ($unit === '') { return self::UNIT; } foreach (self::VARIANTS as $measure => $variants) { foreach ($variants as $variant) { if (preg_match('/\A' . preg_quote($toUtf8($variant), '/') . '\z/iu', $unit) === 1) { return $measure; } } } return self::UNIT; } }