我正在尝试从Google的货币计算中爆炸这部分json字符串:
“3 670.758美元”
我希望价值和货币文本分开,我最初使用白色空间作为分隔符,但是我注意到当我试图转换4个数字时谷歌在第一个和第二个之间添加了一个空格数字,将成千上万的数字等分开。
关于我应该如何解决这个问题的任何想法?
我想知道是否有办法让白色空间仍在爆炸,但跳过第一个?
提前致谢
答案 0 :(得分:3)
尝试正则表达式
preg_match('#([0-9\s\.]+)(.+)#', '3 670.758 U.S. dollars', $result);
$结果将是:
Array
(
[0] => 3 670.758 U.S. dollars
[1] => 3 670.758
[2] => U.S. dollars
)
答案 1 :(得分:2)
不要这样做。
使用适当的API来返回JSON或XML值。这将
不必使用正则表达式
可以免受未来格式更改的影响,这可能会随时出现在Google的计算器中
实际上符合Google's terms of service,您当前的方法并非如此:
5.3 [...]您明确同意不通过任何自动方式(包括使用脚本或网络爬虫)访问(或尝试访问)任何服务,并应确保您遵守服务中存在的任何robots.txt文件。
参见例如this answer用于API建议。谷歌API已被弃用,但雅虎似乎还在运作。
更有可能有用的资源:
答案 2 :(得分:0)
我想知道这是什么样的格式:
3 670.758 U.S. dollars
| `-- digit separator
`-- thousand separator
这将是ISO的东西,但我想知道价格不常见的三位数。由于货币转换,你可能会在这里转换一小部分美分。注意,所以背景很清楚。
要解析这些格式,您可以使用指定这些格式的正则表达式,例如空间为千位分隔符,数千个是可选的,.
为数字分隔符,三位数。货币名称由数字中的另一个空格分隔,整个字符串需要匹配:
^(\d{1,3}(?: \d{3})*\.\d{3}) (.*)$
此表达式可以在PHP中使用,然后使用preg_match
函数:
$str = '3 670.758 U.S. dollars';
$r = preg_match('~^(\d{1,3}(?: \d{3})*\.\d{3}) (.*)$~', $str, $matches);
if ($r) list(, $value, $currency) = $matches;
$value : string(9) "3 670.758"
$currency : string(12) "U.S. dollars"
您制定正则表达式越正确,您获得的结果就越好。 Demo
答案 3 :(得分:0)
另一种变体,你可以使用2次爆炸,如下所示:
$str = "3 670.758 U.S. dollars";
$exp1 = explode(' ', $str, 2);
$exp2 = explode(' ', $exp1[1]);
$final = array($exp1[0].' '.$exp2[0], $exp2[1], $exp2[2]);
var_export($final); // array ( 0 => '3 670.758', 1 => 'U.S.', 2 => 'dollars', )