public function parse()
 {
     // Implement parsing of values like 3 л + 3 л + ... , we need to count their summary here
     $exploded_values = explode('+', $this->value);
     if (!empty($exploded_values) && count($exploded_values) > 1) {
         $summ = 0;
         foreach ($exploded_values as $value) {
             $parser = new VolumeCat4405SpecParser(trim($value));
             $parsed = $parser->parse();
             if ($parsed) {
                 $summ += $parsed[0]['value'];
             } else {
                 $this->parsed = false;
                 $this->matched_regex = '';
                 return $this->parsed;
             }
         }
         $this->parse_called = true;
         $this->parsed = array(array('key' => 'Объем', 'value' => $summ, 'measure' => $parser->getParsed()[0]['measure']));
         $this->parsed = $this->validateParsed($this->parsed);
         return $this->parsed;
     } else {
         return parent::parse();
     }
 }
 protected function patterns()
 {
     $patterns = array();
     $measures_list = implode('|', parent::getMeasureAliases($this->measures));
     $measures = $this->measures;
     $current_key = $this->current_key;
     $patterns = parent::generateSimplePatterns($current_key, $measures);
     return $patterns;
 }
 protected function patterns()
 {
     $patterns = array();
     $measures_list = implode('|', parent::getMeasureAliases($this->measures));
     $measures = $this->measures;
     $patterns['/(\\d+)\\s?(' . $measures_list . ')/mi'] = function ($matches) use($measures) {
         $min_key = array_search(min($matches[1]), $matches[1]);
         return array('key' => 'Отношение сигнал/шум (не меньше)', 'value' => $matches[1][$min_key], 'measure' => \common\spec_parsers\NumericSpecParser::getMeasureByAlias($matches[2][$min_key], $measures));
     };
     return $patterns;
 }
 protected function patterns()
 {
     $patterns = array();
     $measures_list = implode('|', parent::getMeasureAliases($this->measures));
     $measures = $this->measures;
     $current_key = $this->current_key;
     $patterns['/(\\d+)\\s?(' . $measures_list . ')/mi'] = function ($matches) use($measures, $current_key) {
         $max_key = array_search(max($matches[1]), $matches[1]);
         return array('key' => $current_key, 'value' => $matches[1][$max_key], 'measure' => \common\spec_parsers\NumericSpecParser::getMeasureByAlias($matches[2][$max_key], $measures));
     };
     return $patterns;
 }
 protected function patterns()
 {
     $measures = $this->measures;
     $measures_list = implode('|', NumericSpecParser::getMeasureAliases($measures));
     $patterns = $this->generateSimplePatterns('Ширина', $this->measures);
     $patterns['/^(\\d+\\.?\\d*)\\.\\.\\.(\\d+\\.?\\d*)\\s?(' . $measures_list . ')$/mi'] = function ($matches) use($measures) {
         return array('key' => 'Ширина', 'value' => $matches[2], 'measure' => \common\spec_parsers\NumericSpecParser::getMeasureByAlias($matches[3], $measures));
     };
     $patterns['/^\\d+$/mi'] = function ($matches) {
         return NULL;
     };
     return $patterns;
 }
 protected function patterns()
 {
     $current_key = $this->current_key;
     $measures = $this->measures;
     $measures_list = implode('|', $this->getMeasureAliases($measures));
     $patterns = parent::generateSimplePatterns($current_key, $this->measures);
     // 60...90 Мб/с
     $patterns['/^(\\d+\\.?\\d*)\\.\\.\\.(\\d+\\.?\\d*)\\s(' . $measures_list . ')$/mi'] = function ($matches) use($measures, $current_key) {
         $return = [];
         $return[] = array('key' => $current_key, 'value' => $matches[2], 'measure' => \common\spec_parsers\NumericSpecParser::getMeasureByAlias($matches[3], $measures));
         return $return;
     };
     return $patterns;
 }
 protected function patterns()
 {
     $measures = $this->measures;
     $measures_list = implode('|', NumericSpecParser::getMeasureAliases($measures));
     $patterns = $this->generateSimplePatterns('Размеры', $this->measures);
     // 107x62x34 мм
     // 107x62 мм
     // мы не можем парсить такие значения так как не знаем очередность величин
     $patterns['/^(\\d+\\.?\\d*)\\s?x\\s?(\\d+\\.?\\d*)\\s?x\\s?(\\d+\\.?\\d*)\\s(' . $measures_list . ')$/mi'] = function ($matches) {
         return NULL;
     };
     $patterns['/^(\\d+\\.?\\d*)\\s?x\\s?(\\d+\\.?\\d*)\\s(' . $measures_list . ')$/mi'] = function ($matches) {
         return NULL;
     };
     // варианты с х в русской раскладке
     $patterns['/^(\\d+\\.?\\d*)\\s?х\\s?(\\d+\\.?\\d*)\\s?х\\s?(\\d+\\.?\\d*)\\s(' . $measures_list . ')$/mi'] = function ($matches) {
         return NULL;
     };
     $patterns['/^(\\d+\\.?\\d*)\\s?х\\s?(\\d+\\.?\\d*)\\s(' . $measures_list . ')$/mi'] = function ($matches) {
         return NULL;
     };
     // 31 - 36
     // 31 - 36 (...)
     // похоже на размер одежды, и нет ед измерений, так что пропускаем
     $patterns['/^(\\d+\\.?\\d*)\\s?-\\s?(\\d+\\.?\\d*)$/mi'] = function ($matches) {
         return NULL;
     };
     $patterns['/^(\\d+\\.?\\d*)\\s?-\\s?(\\d+\\.?\\d*)\\s?\\(.*\\)$/mi'] = function ($matches) {
         return NULL;
     };
     // 31
     // просто число без ед измерений, пропускаем
     $patterns['/^\\d+$/mi'] = function ($matches) {
         return NULL;
     };
     return $patterns;
 }
 protected function patterns()
 {
     $patterns = parent::generateSimplePatterns($this->current_key, $this->measures);
     return $patterns;
 }
 public function parse()
 {
     if ($this->parse_called) {
         return $this->getParsed();
     }
     if ($this->options['debug']) {
         echo "Trying to match value '{$this->value}' \n";
     }
     $measures = $this->measures;
     $measures_list = implode('|', $this->getMeasureAliases($measures));
     $parse_exploded = function ($exploded_values, &$this, $pattern) {
         if ($this->options['debug']) {
             echo "Exploded values are " . var_export($exploded_values, true) . " \n";
         }
         $result = array();
         foreach ($exploded_values as $value) {
             $parser = new PowerSpecParser(trim($value));
             if ($this->options['debug']) {
                 $parser->setOption('debug', true);
             }
             $parsed = $parser->parse();
             if ($parsed) {
                 $result = array_merge($result, $parsed);
             }
         }
         if (!empty($result)) {
             $this->parsed = $result;
             $this->parsed = $this->validateParsed($this->parsed);
             $this->matched_regex = $pattern;
             $this->parse_called = true;
             if ($this->options['debug']) {
                 echo "Parse result is " . var_export($this->parsed, true) . " \n";
             }
             return $this->parsed;
         } else {
             if ($this->options['debug']) {
                 echo "Parse result is empty \n";
             }
             $this->parsed = false;
             $this->parse_called = true;
             $this->matched_regex = '';
             return false;
         }
     };
     // First, try to process special cases.
     // parse 40 Вт (номинальная), 140 Вт (максимальная)
     $pattern = '/^(.+)\\s(' . $measures_list . ')\\s\\(номинальная\\),\\s(.+)\\s(' . $measures_list . ')\\s\\(максимальная\\)$/mi';
     if (preg_match($pattern, $this->value)) {
         $exploded_values = explode(',', $this->value);
         if (!empty($exploded_values) && count($exploded_values) == 2) {
             return $parse_exploded($exploded_values, $this, $pattern);
         }
     }
     // 30 л.с., 22000 Вт
     $pattern = '/^(.+)\\s(' . implode('|', $measures['л.с.']) . '),\\s(.+)\\s(' . $measures_list . ')$/mi';
     if (preg_match($pattern, $this->value)) {
         $exploded_values = explode(',', $this->value);
         if (!empty($exploded_values) && count($exploded_values) == 2) {
             return $parse_exploded(array($exploded_values[0]), $this, $pattern);
         }
     }
     // 1600 Вт / 2.1 л. с.
     $pattern = '/^(.+)\\s(' . $measures_list . ')\\s\\/\\s(.+)\\s(' . implode('|', $measures['л.с.']) . ')$/mi';
     if (preg_match($pattern, $this->value)) {
         $exploded_values = explode('/', $this->value);
         if (!empty($exploded_values) && count($exploded_values) == 2) {
             return $parse_exploded(array($exploded_values[1]), $this, $pattern);
         }
     }
     // 1600 Вт (макс.|пиковая 2000 Вт)
     $electric_measures = array_diff_key($measures, array('л.с.' => ''));
     $electric_measures = $this->getMeasureAliases($electric_measures);
     $electric_measures = implode('|', $electric_measures);
     $pattern = '/^((.+)\\s(' . $electric_measures . '))\\s\\((макс\\.|пиковая)\\s((.+)\\s(' . $electric_measures . '))\\)$/mi';
     $matches = array();
     if (preg_match($pattern, $this->value, $matches)) {
         $result = array();
         $parser_nominal = new PowerSpecParser(trim($matches[1]));
         $parser_nominal->parse();
         $parser_max = new PowerSpecParser(trim($matches[5]));
         $parser_max->parse();
         if ($parser_nominal->getParsed()) {
             $result[] = array('value' => $parser_nominal->getParsed()[0]['value'], 'measure' => $parser_nominal->getParsed()[0]['measure'], 'key' => 'Мощность номинальная');
         }
         if ($parser_max->getParsed()) {
             $result[] = array('value' => $parser_max->getParsed()[0]['value'], 'measure' => $parser_max->getParsed()[0]['measure'], 'key' => 'Мощность максимальная');
         }
         if (!empty($result)) {
             $this->parsed = $result;
             $this->parsed = $this->validateParsed($this->parsed);
             $this->matched_regex = $pattern;
             $this->parse_called = true;
             if ($this->options['debug']) {
                 echo "Parse result is " . var_export($this->parsed, true) . " \n";
             }
             return $this->parsed;
         } else {
             if ($this->options['debug']) {
                 echo "Parse result is empty \n";
             }
             $this->parsed = false;
             $this->parse_called = true;
             $this->matched_regex = '';
             return false;
         }
     }
     // If the parsed value should not be processed by code above let it to be processed by standard method with patterns declared in $this->patterns.
     return parent::parse();
 }