protected function parse($st) { $st = preg_replace('/[\\w\\d]{100,}/', '', $st); // убираем слишком длинную строку, иначе рушится регулярка if (!preg_match_all('#' . '.*?<strong>(?<_name>[^<]+?\\d[^<]+?)<' . '.*?Телефон: (?<phone>.+?)<br>' . '.*?Режим работы: (?<hours>.+?)<br>' . '(?<wheel>[^<]+?маломобильн)?' . '.*?Адрес: .+?, (?<_addr>.+?)<br>' . '(.{0,1500}?viewPointOnMap..(?<lon>[\\d.]+).,.(?<lat>[\\d.]+).)?' . '#su', $st, $m, PREG_SET_ORDER)) { return; } foreach ($m as $obj) { if ($obj['wheel']) { $obj['wheelchair'] = 'yes'; } $obj['contact:phone'] = $this->phone($obj['phone']); // номер отделения if (preg_match('#[\\d/]+#', $obj['_name'], $m_)) { $obj['ref'] = $m_[0]; } // формируем часы работы $obj['opening_hours'] = $this->time($this->parseTime($obj['hours'])); // обрабатываем адрес $obj['_addr'] = preg_replace('/\\d{6}/i', '', $obj['_addr']); // убираем индекс $obj['_addr'] = preg_replace('/(^[^а-я0-9]+|[^а-я0-9]+$)/ui', '', $obj['_addr']); // мусор на границах $obj['_addr'] = preg_replace('/\\(.+/ui', '', $obj['_addr']); // убираем все что в скобках и правее // отделение if (preg_match('/[а-я]+ отделение/iu', $obj['_name'], $m)) { $obj['department'] = $m[0]; } if (strpos($obj[0], 'не обслуживаются')) { $obj['disused'] = 'yes'; $obj['opening_hours'] = ''; } // заменяем координаты с сайта сбербанка на геокодированные $geocoder = new Geocoder(); $obj = array_merge($obj, $geocoder->getCoordsByAddress($obj['_addr'])); $this->addObject($this->makeObject($obj)); } }
/** создание объекта с нужными полями */ protected function makeObject($fields) { if (!empty($fields['_addr'])) { $fields['_addr'] = trim(strip_tags($fields['_addr'])); } // добавляем координаты if (empty($fields['lat']) && !empty($fields['_addr'])) { $geocoder = new Geocoder(); $fields += $geocoder->getCoordsByAddress($fields['_addr']); } $obj = array(); foreach ($this->fields as $k => $v) { if (isset($fields[$k]) && $fields[$k] !== '') { $obj[$k] = '' . $fields[$k]; } else { if (is_array($v)) { $v = @$v[$this->region]; } if ($v) { $obj[$k] = '' . $v; } } } return $obj; }