/** * parse a string of form U+A..U+B,U+C in a Range */ public static function parseRange($str, $db) { $set = []; $junks = preg_split('/\\s*(?:,\\s*)+/', trim($str)); foreach ($junks as $j) { $ranges = preg_split('/\\s*(?:-|\\.\\.|:)\\s*/', $j); switch (count($ranges)) { case 0: break; case 1: $tmp = Toolkit::parseCodepoint($ranges[0]); if (is_int($tmp)) { $set[] = $tmp; } break; case 2: $low = Toolkit::parseCodepoint($ranges[0]); $high = Toolkit::parseCodepoint($ranges[1]); if (is_int($low) && is_int($high)) { $set = array_merge($set, range(min($low, $high), max($high, $low))); } break; default: $max = -1; $min = 0x110000; foreach ($ranges as $r) { $tmp = Toolkit::parseCodepoint($r); if (is_int($tmp) && $tmp > $max) { $max = $tmp; } if (is_int($tmp) && $tmp < $min) { $min = $tmp; } } if ($min < 0x110000 && $max > -1) { $set = array_merge($set, range(min($min, $max), max($max, $min))); } } } return new Range($set, $db); }