2012-06-03 3 views
1

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

Вот некоторые примеры: Этот автомобиль стоит $ 15k и имеет $ 200 в модернизации Эти ремни 500,00 USD и я прошу 50 за доставку

Мой подход был сделать три отдельные Regex матчи:

  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? Но не знаю, почему они ничего не подходят. Допустим, я немного смущен тем, должен ли я использовать^и $, но я пробовал его с и без, и это, похоже, не имеет значения. Любая помощь будет оценена по достоинству. Благодарю.

+1

''^означает начало исходной строки и '' $ означает конец исходной строки. Если вы их добавите, вы, конечно, не сможете сопоставить только какой-то токен внутри строки. – nhahtdh

+1

Обратите внимание, что в Германии мы используем что-то вроде: 1.999,99 € – rekire

ответ

2

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

/(?<![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. Но он отклонит .453985, ..,.,.434.,.34, 234,43.234, 23467,4443.234.

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

/(?<= |^)(?:(?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))(?= |$)/

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

Тестовый вход и try it out:

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

+1

Вау - спасибо! Мне понадобится неделя, чтобы понять это. На всякий случай, вот кто я использую для суффикса: preg_match_all ('/ (? <= | ^) (?: [0-9] {1,3} (?:,? [0-9] {3 }) * (: \ [0-9] *) | [0-9] {1,3} (?.?.? \ [0-9] {3}) * (: [0- 9] *)?) * (?: \ $ | Usd | eur | euro | euros | firm | obro | € | £ | gbp | dollar | aud | cdn | sgd) + (? = | $)/', Strtolower ($ description), $ price_array3); и это для префикса: preg_match_all ('/ (? <= | ^) (? :(? i) (?: \ $ | usd | цена: | euro | £ | € | gbp | cdn | sgd) *) + (: [0-9] {1,3} (:, [0-9] {3}) * (?:???.? \ [0-9] *) | [0-9] {1, 3} (?: \ [0-9] {3}.?) * (?: [0-9] *)????!.) (:(я) к) ([0-9, ])/', strtolower ($ description), $ price_array1); – user1420094