我知道这个主题在某种程度上已被涵盖,但几天之后我仍然无法找出从一块文本中解析价格的最佳方法。
以下是一些例子: 这辆车的价格为15,000美元,升级费用为200美元 这些腰带是500.00美元,我要求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);
但实际上这些似乎都没有奏效。我想我的正则表达式是正确的吗?但不确定为什么他们没有匹配任何东西。 我承认我对是否应该使用^和$有点困惑,但是我已经尝试过和不使用它似乎没有什么区别。 任何帮助,将不胜感激。谢谢。
答案 0 :(得分:2)
这是我对严格匹配类似数字的数字的解决方案(它不会注意到任何前缀或后缀,甚至是千分之一的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
,{{ 1}}。但它会拒绝324849000
,.453985
,..,.,.434.,.34
,234,43.234
。
除了普通数字之外,以下内容将匹配不区分大小写的前缀和k(千位):
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)
如果您想添加更多后缀,则与上述相同。
测试输入和try it out:
/(?<= |^)(?:[0-9]{1,3}(?:,?[0-9]{3})*(?:\.[0-9]*)?|[0-9]{1,3}(?:\.?[0-9]{3})*(?:,[0-9]*)?)(?:(?i)(?:k )? *(?:\$|USD))(?= |$)/