Author Topic: Поиск первой и последней цифры в тексте  (Read 1782 times)

0 Members and 1 Guest are viewing this topic.

Axelenz

  • Освоившийся
  • **
  • Posts: 31
  • Парсинг сайтов, наполнение интернет-магазинов
    • View Profile
Уважаемые знатоки форума, прошу подсказать, может есть более изящное решение следующей задачи.

Есть массив:

Code: (html5) [Select]
Хорошая, лучшая цена: 10,50 y.e. ед.товара
Только сегодня, цена - 21.39 y.e. за штуку
Купите товар по ц.: 15,7 y. e. в розницу
. . .

необходимо из каждой текстовой строки $price массива данных вырезать только саму цену, т.е. цифры с любыми разделительными знаками между ними.
Вариант

Code: (clickermann) [Select]
$price = STRFILTER($price,".0123456789,", 1)

не подходит из-за непредсказуемости текста. Подходит только вариант найти первую и последнюю цифры в тексте, а до и после - всё отбросить.

Набросал вот такой код, но может кто подскажет более простой/быстрый вариант, как это лучше реализовать ?

Code: (clickermann) [Select]
//---------- поиск первой и последней цифры в цене
                     FOR($na = 1, $na < strlen($price))
                        $first = $na
                        IF(STRPOS("0123456789", STRCUT($price, $na, 1)) > 0)
                           $na = strlen($price)
                        END_IF
                     END_CYC
                     $price = strcut2($price, $first, strlen($price))
                     FOR($na = strlen($price), $na > 0, -1)
                        $last = $na
                        IF(STRPOS("0123456789", STRCUT($price, $na, 1)) > 0)
                           $na = 0
                        END_IF
                     END_CYC
                     $price = strcut2($price, 1, $last)
                     //---------------------------------------
"Можно бесконечно смотреть на три вещи: как течёт вода, как горит огонь и как Clickermann работает вместо тебя..."

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Code: (clickermann) [Select]
ARRPUSH($price, "Хорошая, лучшая цена: 10,50 y.e. ед.товара")
ARRPUSH($price, "Только сегодня, цена - 21.39 y.e. за штуку")
ARRPUSH($price, "Купите товар по ц.: 15,7 y. e. в розницу")

FOR($a=0,$a<ARRSIZE($price)) // обрабатываем массив
   STRSEPARATE($price[$a], " ", $arr)
   FOR($b=0,$b<ARRSIZE($arr))
      IF(STRLEN(STRFILTER($arr[$b], ".0123456789,", 0)) = 0)
         $price[$a] = $arr[$b]
         $b=ARRSIZE($arr)
      END_IF
   END_CYC
   UNDEFINE($arr)
END_CYC

// Вывод массива в лог
FOR($a=0,$a<ARRSIZE($price))
   LOGWRITE ($price[$a])
END_CYC


HALT

Axelenz

  • Освоившийся
  • **
  • Posts: 31
  • Парсинг сайтов, наполнение интернет-магазинов
    • View Profile
Oraven, спасибо за вариант, а какие плюсы гибкость/скорость даёт использование массива в данном случае ?
Как проверить оба варианта на скорость выполнения ?

Вариант
Code: (clickermann) [Select]
STRSEPARATE($price[$a], " ", $arr)не подходит опять же из-за человеческого фактора. Текст может быть написан с ошибками, например без пробелов между цифрами и словами...

Code: [Select]
Хорошая, лучшая цена:10,50 y.e. ед.товара
Только сегодня, цена - 21.39y.e. за штуку

тогда не получаем желаемый результат... В моём случае правильный результат важнее скорости выполнения, потому, что потом ошибки вылавливать вручную больше времени займёт...

Code: [Select]
14:58:25 Хорошая, лучшая цена:10,50 y.e. ед.товара
14:58:25 Только сегодня, цена - 21.39y.e. за штуку
14:58:25 15,7
14:58:25 10,50
14:58:25 21.39
14:58:25 15,7
14:58:25 10,50
14:58:25 21.39

« Last Edit: April 14, 2018, 03:00:10 PM by Axelenz »
"Можно бесконечно смотреть на три вещи: как течёт вода, как горит огонь и как Clickermann работает вместо тебя..."