正则表达式:在JSON字符串中检索货币

时间:2011-08-05 02:03:07

标签: php regex

我正在使用Google计算器来检索转换后的价格,示例输出为:

{lhs: "9000 Euros",rhs: "12 721.5 U.S. dollars",error: "",icc: true}

现在我不能将json_decode用于此JSON字符串,我已经尝试过但它不起作用,因此我使用正则表达式来检索rhs字段中的转换价格。 / p>

我需要让正则表达式能够解析数字,而不是货币名称,只是数字,但是我在获取包含字段空间的价格时遇到问题,到目前为止我的正则表达式只有得到12,我无法得到完整的12 721.5

/rhs\: "(\d+|\s+)/i

如何在不包含价格名称的情况下执行此操作?请注意,响应可能/可能不包括转换价格中的空间以及期间。

3 个答案:

答案 0 :(得分:2)

如果您只想提取数字部分,那么您的正则表达式可能是:

 /[,{]\s*rhs\s*:\s*"([\d.\s]+)/

[...]方括号是这里替代的适当语法(小数和空格的任意组合)。

编辑:缺少小数点,还有一些用于验证“json”一致性的正则表达式。

答案 1 :(得分:1)

[...]应该捕获空间和.并在空格和货币之前终止。

/rhs: "([\d .]+)\s/

编辑: 添加获取数据的PHP代码(在我的环境中)

$string = "{lhs: \"9000 Euros\",rhs: \"12 721.5 U.S. dollars\",error: \"\",icc: true}";

$pattern = '/rhs: "([\d .]+)\s/';
preg_match($pattern,$string,$matches);
print "<pre>"; var_dump($matches); print "</pre>";
echo $matches[1];

答案 2 :(得分:0)

此正则表达式:/rhs\: "(\d+|\s+)/i表示(一个或多个十进制数字)或(一个或多个空格)。它不允许任何十进制数字空格的组合。

$json = '{lhs: "9000 Euros",rhs: "12 721.5 U.S. dollars",error: "",icc: true}';

$matches = array();
preg_match('/"?rhs"?:\s*"((?:[\d ])*(?:\.\d+)?)/', $json, $matches);
$usd = floatval(str_replace(' ', '', $matches[1]));
echo $usd; // Outputs '12721.5'

这应该有效,如果他们的JSON有效,它将继续有效。