爆炸,但跳过第一个白色空间 - 可能吗?

时间:2012-02-15 15:41:16

标签: php

我正在尝试从Google的货币计算中爆炸这部分json字符串:

“3 670.758美元”

我希望价值和货币文本分开,我最初使用白色空间作为分隔符,但是我注意到当我试图转换4个数字时谷歌在第一个和第二个之间添加了一个空格数字,将成千上万的数字等分开。

关于我应该如何解决这个问题的任何想法?

我想知道是否有办法让白色空间仍在爆炸,但跳过第一个?

提前致谢

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', )