如何从字符串 <?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];
或者你可以循环遍历,随心所欲。
你可以使用正则表达式,如果你不熟悉,那就另当别论了。
这里有一个片段,您或许可以使用。我做的有点快,所以它可能不会在所有情况下都有效,但这应该是一个开始。
<?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";
}
?>
输入: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];
或者你可以循环遍历,随心所欲。
你可以使用正则表达式,如果你不熟悉,那就另当别论了。
这里有一个片段,您或许可以使用。我做的有点快,所以它可能不会在所有情况下都有效,但这应该是一个开始。
<?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";
}
?>