如何从字符串 <?PHP ?> 中提取多个价格(例如:“$46.99”)

How to extract multiple prices (ex: "$46.99") from a string <?PHP ?>

输入:string = "10 New from .00 40 Used from [=11=].74";

期望的输出:$new = 9.00; $used = 0.74;

我通过 cURL 从一个网站的源代码中提取了一本书的价格,需要从一个段中提取最高的 ($new_price) 和最低的 ($used_price)的代码。 你好, 我知道这听起来像是一个非常容易解决的问题,但我已经花了大约 5 个小时试图解决这个问题,但一无所获。我的目标是从一串源代码(由 cURL 收集)中删除两个价格,并将每个价格存储在其自己的变量中。我保留 运行 的问题是我不知道价格将是多少位数(一到四位数),并且由于某种原因我无法使用函数 substr()。我唯一的猜测是,也许我正在计算的 "string" 根本不是字符串,而是一些其他数据类型,因为它是 HTML 的一部分。 到目前为止,这是我尝试过的:

尝试 1:删除所有字符 != 数字。我只剩下两个数字,但无法弄清楚如何将两个小数分隔成变量。

尝试 2:尝试将整个字符串分成两部分,每部分包含一个我可以隔离的整数。我 运行 遇到的问题是我无法计算要用 substr() 分隔的字符串。另外,每个字符串中会有多个数字,所以我只能识别以“$”开头的整数“

你最好使用正则表达式来实现你想要的(使用这个正则表达式 /$(\d.\d+))。

$string = "10 New from .00 40 Used from [=10=].74";
preg_match_all('/$(\d\.\d+)/', $string, $matches);
print_r($matches);

哪个returns:

Array
(
    [0] => Array
        (
            [0] => .00
            [1] => [=11=].74
        )

    [1] => Array
        (
            [0] => 9.00
            [1] => 0.74
        )

)

允许您根据从第一个索引中选择的值分配值。

$new = $matches[0][0];
$used = $matches[0][1];

或者你可以循环遍历,随心所欲。

Example

你可以使用正则表达式,如果你不熟悉,那就另当别论了。

这里有一个片段,您或许可以使用。我做的有点快,所以它可能不会在所有情况下都有效,但这应该是一个开始。

<?php

$string = "10 New from .00 40 Used from [=10=].74";

$pattern = '/^(.*)(New(.*)(?P<new>$[0-9]+\.[0-9]+))(.*)(Used(.*)(?P<used>$[0-9]+\.[0-9]+))(.*)$/i';

if (preg_match($pattern, $string, $matches)) {
  $new = $matches['new'];
  $used = $matches['used'];

  echo "New: $new...\n";
  echo "Used: $used...\n";
}
else {
  echo "No prices found in string...\n";
}

?>