Я знаю, что эта тема в какой-то степени была покрыта, но через несколько дней мне все еще трудно понять, как лучше разобрать цену из блока текста.
Вот несколько примеров: этот автомобиль составляет 15 тыс. Долларов США и имеет 200 долларов США на модернизацию. Эти ремни составляют 500 долларов США, и я прошу 50 за доставку
Мой подход состоял в том, чтобы сделать три отдельных матча регулярных выражений:
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