Я пытаюсь разобрать цену из строки, однако цена имеет много разных форматов, которые я пытаюсь зафиксировать как можно лучше.. вот код, который у меня есть:
$pattern = '#([Ii][Dd][Rr].?\s*[0-9.,]+)|([Rr][Pp].?\s*[0-9.,]+)|(\s[0-9]+\s?[Kk]\s)|([0-9]+[Rr][Bb])|([0-9.,]+\s*[Rr][Ii][Bb][Uu])|(\b[0-9]+[.,][0-9]+[.,]?[0-9]+)#u';
if (!$this->price)
{
$matches = array();
preg_match($pattern, $caption, $matches);
if (isset($matches[0]))
{
$price = $matches[0];
$price = preg_replace("#[K|k]|[R|r][B|b]#", "000", $price);
$price = preg_replace("#[^0-9]#", "", $price);
if (strlen($price) > 7)
{
return false;
}
$price = floatval($price);
if ($price < 1000)
{
$price *= 1000;
}
$this->price = $price;
//Remove finded price
$this->caption = preg_replace($pattern, '', $caption, 1);
$result = true;
}
}
и вот ценовая строка:
Peacock long blouse Bahan combat, fit to XXL, pj77cm, Ld120cm, berat 0,21kg, Hitam, body pjg, ukuran besar 71.000 (blm + ongkir)// stock terbatas sistaa......
однако это возвращает мне 21.000, потому что он анализирует строку 0.21kg как цену. Как избежать 0 или 0. как определение цены в шаблоне?
([Ii][Dd][Rr].?\s*[0-9.,]+)|([Rr][Pp].?\s*[0-9.,]+)|(\s[0-9]+\s?[Kk]\s)|([0-9]+[Rr][Bb])|([0-9.,]+\s*[Rr][Ii][Bb][Uu])|(\b[1-9]+[.,][0-9]+[.,]?[0-9]+)
Попробуйте это. Смотрите демоверсию. ,21kg
было захвачено 6th
группами вашего регулярного выражения (\b[0-9]+[.,][0-9]+[.,]?[0-9]+)
Поменял это на (\b[1-9]+[.,][0-9]+[.,]?[0-9]+)
чтобы исключить 0,
и 0.
..