Пример #1
0
 /**
  * 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);
 }