如何在PHP中通过空格和双引号分割字符串

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并拆分所有标记,包括“.”。

所以您基本上想要拆分一个数字,然后是一个字符串? - Jeff Langemeier
作为一般性的提示,正则表达式尽可能具体,如果不需要使用\s而\d可以工作,请不要使用\s。 - Jeff Langemeier
你那里没有字符串,从技术上讲,我不确定那是什么,但它不是一个字符串(没有开头或结尾的引号,不确定哪些是你想要解析的字符串的一部分,哪些不是)。 - Jeff Langemeier
preg_split 有时会与 preg_match_all 混淆。 - hjpotter92
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
  • 类型:台币

它运行良好!感谢您的答案。它真的很整洁,有组织且易读。我已经卡在这个问题上两天了。非常感谢。 - jeanpch

0
以下代码应首先获取格式为< number>[.< number>]的数字,然后将其后面的所有内容作为第二组,该组应与您的描述匹配,除非在您的问题中存在某些特殊情况。
preg_match('/([0-9]+\.{0,1}[0-9]*)\s+(.*?)/', $data, $matches);
print_r($matches);

谢谢您的时间和回复。这个问题已经解决了。我认为这个 preg_match 函数对我来说是一个全新的函数要掌握。 - jeanpch

0

假设格式始终相同,可以使用字符串函数在一行中完成此操作。

$string = '1hs: "1 U.S. dollar", rhs: "29.892653 Taiwan dollars"';
$data = explode(' ', trim(substr($string, strrpos($string, ':')+2), '"'),2);
var_dump($data);

谢谢您的帮助,尽管我使用的版本似乎不支持var_dump函数。问题已解决。 - jeanpch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接