<?php
class Tyre {
/**
* RegExp
*
* @var string
*/
private $pattern;
/**
* @var string
*/
private $subject;
/**
* @var string
*/
private $brand;
/**
* @var string
*/
private $width;
/**
* @var string
*/
private $serial;
/**
* @var string
*/
private $radius;
/**
* @var string
*/
private $index;
/**
* @var string
*/
private $model;
private $tyreBrands = array( 'Nokian',
'Good Year',
'Continental',
// ...
);
public function __construct($subject) {
$this->pattern = '#(' . implode('|', $this->tyreBrands) . ')\s(\d{3})/(\d{2})\sR(\d{2})\s(\d{2,3}\w)\s(.*)#'; $this->subject = $subject;
}
public function parse() {
if (preg_match($this->pattern, $this->subject, $matches)) { if (count($matches) !== 7) { throw new LogicException('Что-то пошло не так, слишком мало данные после парсинга.');
}
$this->brand = $matches[1];
$this->width = $matches[2];
$this->serial = $matches[3];
$this->radius = $matches[4];
$this->index = $matches[5];
$this->model = $matches[6];
}
echo 'Brand: ', $this->brand;
echo '<br>';
echo 'Типоразмер: ', $this->width, '/', $this->serial;
echo '<br>';
echo 'Радиус: ', $this->radius;
echo '<br>';
echo 'Индекс скорости: ', $this->index;
echo '<br>';
echo 'Модель: ', $this->model;
echo '<hr>', PHP_EOL;
}
}
$tyre = new Tyre('Nokian 185/70 R14 92T HKPL5');
$tyre->parse();
$tyre = new Tyre('Nokian 245/45 R18 100T HKPL 8 Run Flat XL');
$tyre->parse();
$tyre = new Tyre('Good Year 175/65 R14 82T UG ICE ARCTIC D-STUD');
$tyre->parse();
$tyre = new Tyre('Good Year 205/70 R15 96T UG ICE ARCTIC D-STUD SUV');
$tyre->parse();
PD9waHAKCmNsYXNzIFR5cmUgewogICAgLyoqCiAgICAgKiBSZWdFeHAKICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcml2YXRlICRwYXR0ZXJuOwoKICAgIC8qKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSAkc3ViamVjdDsKCiAgICAvKioKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgJGJyYW5kOwoKICAgIC8qKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSAkd2lkdGg7CgogICAgLyoqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcml2YXRlICRzZXJpYWw7CgogICAgLyoqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcml2YXRlICRyYWRpdXM7CgogICAgLyoqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcml2YXRlICRpbmRleDsKCiAgICAvKioKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgJG1vZGVsOwoKICAgIHByaXZhdGUgJHR5cmVCcmFuZHMgPSBhcnJheSgKICAgICAgICAnTm9raWFuJywKICAgICAgICAnR29vZCBZZWFyJywKICAgICAgICAnQ29udGluZW50YWwnLAogICAgICAgIC8vIC4uLgogICAgKTsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHN1YmplY3QpIHsKICAgICAgICAkdGhpcy0+cGF0dGVybiA9ICcjKCcgLiBpbXBsb2RlKCd8JywgJHRoaXMtPnR5cmVCcmFuZHMpIC4gJylccyhcZHszfSkvKFxkezJ9KVxzUihcZHsyfSlccyhcZHsyLDN9XHcpXHMoLiopIyc7CiAgICAgICAgJHRoaXMtPnN1YmplY3QgPSAkc3ViamVjdDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gcGFyc2UoKSB7CiAgICAgICAgaWYgKHByZWdfbWF0Y2goJHRoaXMtPnBhdHRlcm4sICR0aGlzLT5zdWJqZWN0LCAkbWF0Y2hlcykpIHsKICAgICAgICAJaWYgKGNvdW50KCRtYXRjaGVzKSAhPT0gNykgewogICAgICAgIAkJdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCfQp9GC0L4t0YLQviDQv9C+0YjQu9C+INC90LUg0YLQsNC6LCDRgdC70LjRiNC60L7QvCDQvNCw0LvQviDQtNCw0L3QvdGL0LUg0L/QvtGB0LvQtSDQv9Cw0YDRgdC40L3Qs9CwLicpOwogICAgICAgIAl9CiAgICAgICAgICAgICR0aGlzLT5icmFuZCA9ICRtYXRjaGVzWzFdOwogICAgICAgICAgICAkdGhpcy0+d2lkdGggPSAkbWF0Y2hlc1syXTsKICAgICAgICAgICAgJHRoaXMtPnNlcmlhbCA9ICRtYXRjaGVzWzNdOwogICAgICAgICAgICAkdGhpcy0+cmFkaXVzID0gJG1hdGNoZXNbNF07CiAgICAgICAgICAgICR0aGlzLT5pbmRleCA9ICRtYXRjaGVzWzVdOwogICAgICAgICAgICAkdGhpcy0+bW9kZWwgPSAkbWF0Y2hlc1s2XTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZWNobyAnQnJhbmQ6ICcsICR0aGlzLT5icmFuZDsKICAgICAgICBlY2hvICc8YnI+JzsKICAgICAgICBlY2hvICfQotC40L/QvtGA0LDQt9C80LXRgDogJywgJHRoaXMtPndpZHRoLCAnLycsICR0aGlzLT5zZXJpYWw7CiAgICAgICAgZWNobyAnPGJyPic7CiAgICAgICAgZWNobyAn0KDQsNC00LjRg9GBOiAnLCAkdGhpcy0+cmFkaXVzOwogICAgICAgIGVjaG8gJzxicj4nOwogICAgICAgIGVjaG8gJ9CY0L3QtNC10LrRgSDRgdC60L7RgNC+0YHRgtC4OiAnLCAkdGhpcy0+aW5kZXg7CiAgICAgICAgZWNobyAnPGJyPic7CiAgICAgICAgZWNobyAn0JzQvtC00LXQu9GMOiAnLCAkdGhpcy0+bW9kZWw7CiAgICAgICAgZWNobyAnPGhyPicsIFBIUF9FT0w7CiAgICB9Cn0KCiR0eXJlID0gbmV3IFR5cmUoJ05va2lhbiAxODUvNzAgUjE0IDkyVCBIS1BMNScpOwokdHlyZS0+cGFyc2UoKTsKCiR0eXJlID0gbmV3IFR5cmUoJ05va2lhbiAyNDUvNDUgUjE4IDEwMFQgSEtQTCA4IFJ1biBGbGF0ICBYTCcpOwokdHlyZS0+cGFyc2UoKTsKCiR0eXJlID0gbmV3IFR5cmUoJ0dvb2QgWWVhciAxNzUvNjUgUjE0IDgyVCBVRyBJQ0UgQVJDVElDIEQtU1RVRCcpOwokdHlyZS0+cGFyc2UoKTsKCiR0eXJlID0gbmV3IFR5cmUoJ0dvb2QgWWVhciAyMDUvNzAgUjE1IDk2VCBVRyBJQ0UgQVJDVElDIEQtU1RVRCBTVVYnKTsKJHR5cmUtPnBhcnNlKCk7