Справка PHP Regex для парсинга Цена из строки

Я знаю, что эта тема в какой-то степени была покрыта, но через несколько дней мне все еще трудно понять, как лучше разобрать цену из блока текста.

Вот несколько примеров: этот автомобиль составляет 15 тыс. Долларов США и имеет 200 долларов США на модернизацию. Эти ремни составляют 500 долларов США, и я прошу 50 за доставку

Мой подход состоял в том, чтобы сделать три отдельных матча регулярных выражений:

  1. Чтобы найти цены, сокращенные с помощью K
  2. Чтобы найти цены с префиксом
  3. Чтобы найти цены с суффиксом

искать доллары с тысячами сокращенных

preg_match_all('/^[0-9,]+(\.[0-9]{2})?(k)+$/', strtolower($description), $price_array1); 

искать доллары с префиксами

 preg_match_all('/^(\$|\$ |price|price |price is |price:|price: |us|us |usd|usd |asking|asking |wanting|wanting |want|want |sgd|euro|euro |£|£ |€|€ |gbp|gbp |cdn|cdn |)+[0-9,]+(\.[0-9]{2})?$/', strtolower($description), $price_array2); 

искать доллары с суффиксами

 preg_match_all('/(\$[0-9,]+(\.[0-9]{2})?)( eur|eur| firm| obo| shipped| \$|\$| €|€| £|£| gbp|gbp| dollar| aud)+/', strtolower($description), $price_array3); 

Но на самом деле ни один из них, похоже, не работает. Я думаю, что у меня правильное Regex? Но не знаю, почему они ничего не подходят. Я признаю, что я немного смущен тем, должен ли я использовать ^ и $, но я пробовал его с и без, и это, похоже, не имеет значения. Любая помощь будет оценена по достоинству. Благодарю.

Это мое решение для строгого соответствия числам, похожим на деньги (он не заметит ни префикса, ни суффикса, даже k для тысяч):

/(?<![0-9.,])(?:[0-9]{1,3}(?:,?[0-9]{3})*(?:\.[0-9]*)?|[0-9]{1,3}(?:\.?[0-9]{3})*(?:,[0-9]*)?)(?![0-9.,])/

Он примет 34563745,34534 , 283947982.234 , 283.432 , 234424. , 4234,4324 , 2.234.434,23442 , 3,234,234.234 , 324849000 , 3,234,234.234 , 324849000 . Но он отклонит .453985 , ..,.,.434.,.34 , 234,43.234 , 23467,4443.234 .

Следующие будут соответствовать префикс без учета регистра и с k (для тысяч), кроме простых чисел:

/(?<= |^)(?:(?i)(?:\$|USD) *)?(?:[0-9]{1,3}(?:,?[0-9]{3})*(?:\.[0-9]*)?|[0-9]{1,3}(?:\.?[0-9]{3})*(?:,[0-9]*)?)(?:(?i)k)?(?![0-9.,])/

Если вы хотите добавить еще префикс, вы можете изменить эту часть регулярного выражения:

(?:\$|USD)

Просто добавьте больше префикса, без начального или конечного пробела. Регулярное выражение будет пытаться соответствовать, даже если есть много пробелов.

Следующее будет соответствовать числу с суффиксом (с дополнительным индикатором тысяч):

/(?<= |^)(?:[0-9]{1,3}(?:,?[0-9]{3})*(?:\.[0-9]*)?|[0-9]{1,3}(?:\.?[0-9]{3})*(?:,[0-9]*)?)(?:(?i)(?:k )? *(?:\$|USD))(?= |$)/

То же, что и выше, если вы хотите добавить дополнительный суффикс.

Тестовый ввод и попробовать :

Here's are some examples: This car is $15k and has $200 in upgrades Those belts are USD 500.00 and I'm asking 50 for shipping 345,345.45 495.344,424 ..,5435 878,543.455.345 345345435.545 234728394,34345 345, 453. 0.4355 .453 sdfsd usd 23423423K