3

我有如下字符串

$data = 1hs: "1 U.S. dollar", rhs: "29.892653 Taiwan dollars"

我想只用空格和双引号分割字符串,这样我就可以得到这样的数组:

$data[ ]= 29.892653  <--- the most important part I would like to get. 
$data[ ]= Taiwan dollars <--- not sure is it possible to do this?

到目前为止,我使用下面的代码

$data = preg_split("/[,\s]*[^\w\s]+[\s]*/", $data,0,PREG_SPLIT_NO_EMPTY); 

但它只返回 29 并拆分所有标记,包括“。”

4

3 回答 3

1

此正则表达式将为您提取所有内容到命名良好的数组字段中。

$data = '1hs: "1 U.S. dollar", rhs: "29.892653 Taiwan dollars"';

// Using named capturing groups for easier reference in the code
preg_match_all(
    '/(?P<prefix>[^,\s:]*):\s"(?P<amount>[0-9]+\.?[0-9]*)\s(?P<type>[^"]*)"/', 
    $data, 
    $matches, 
    PREG_SET_ORDER);

foreach($matches as $match) {
    // This is the full matching string
    echo "Matched this: " . $match[0] . "<br />";

    // These are the friendly named pieces
    echo 'Prefix: ' . $match['prefix'] . "<br />";
    echo 'Amount: ' . $match['amount'] . "<br />";
    echo 'Type: ' . $match['type'] . "<br />";
}

输出:

  • 匹配这个:1hs:“1美元”
  • 前缀:1hs
  • 数量:1
  • 类型:美元

和:

  • 匹配这个:rhs:“29.892653 台币”
  • 前缀:rhs
  • 金额:29.892653
  • 类型:台币
于 2013-03-29T21:06:37.147 回答
0

下面的代码应该首先获取一个格式为 <number>[.<number>] 的数字,然后将之后的所有内容作为第二组,这应该与您的描述相匹配,除非您的问题中有一些不可见的特殊情况。

preg_match('/([0-9]+\.{0,1}[0-9]*)\s+(.*?)/', $data, $matches);
print_r($matches);
于 2013-03-29T20:20:25.653 回答
0

假设格式始终相同,这可以用字符串函数在一行中完成

$string = '1hs: "1 U.S. dollar", rhs: "29.892653 Taiwan dollars"';
$data = explode(' ', trim(substr($string, strrpos($string, ':')+2), '"'),2);
var_dump($data);
于 2013-03-29T20:32:57.200 回答