使用PHP和Regex获取Steam社区市场上商品的价格

时间:2014-04-14 08:44:12

标签: php regex steam

我正在尝试使用PHP来获取项目的Steam社区市场价格。我拿了一个网址(例如:http://steamcommunity.com/market/listings/730/StatTrak%E2%84%A2%20P250%20%7C%20Steel%20Disruption%20%28Factory%20New%29)然后我用file_get_contents()下载内容。我试着用这个:

function getInnerHTML($string, $tagname, $closetagname) {
    $pattern = "/<$tagname ?.*>(.*)<\/$closetagname>/";
    preg_match($pattern, $string, $matches);
    return $matches[1];
}

使用

getInnerHTML($str, 'span class="market_listing_price market_listing_price_with_fee"', 'span');

我对file_get_contents的一个例子是:

<span class="market_table_value">
    <span class="market_listing_price market_listing_price_with_fee">
        $1.92               </span>
    <span class="market_listing_price market_listing_price_without_fee">
        $1.68               </span>
    <br/>
</span>

但它什么也没有回报。

有人有想法吗?

3 个答案:

答案 0 :(得分:36)

当有一个完美的工作调用返回JSON时,不完全确定为什么你想要通过HTML进行艰难的方式和正则表达式。虽然原始答案是正确的并且直接回答OP问题,但这提供了一种更容易和有效的方法来获得项目的市场价值。

获取

http://steamcommunity.com/market/priceoverview/?currency=3&appid=730&market_hash_name=StatTrak%E2%84%A2%20P250%20%7C%20Steel%20Disruption%20%28Factory%20New%29

JSON响应

{
  "success": true,
  "lowest_price": "1,43&#8364; ",
  "volume": "562",
  "median_price": "1,60&#8364; "
}

响应定义

success:布尔值,如果调用成功则为true;如果出现问题则为false 或者Steam市场上没有此项目的列表

lowest_price:带有货币符号[pre- / ap]的字符串值,具体取决于指定的查询参数。请参阅下面的一些其他参数。

volume:以字符串形式返回的整数值(?) - 已售出/购买的此特定商品的总数。

median_price:带有货币符号[pre- / ap]的字符串值。商品的平均售价。请参阅Steam marketplace项目图表,以便更好地了解中位数的计算方法。

查询参数

appid:游戏/应用的唯一(静态定义)Steam应用ID,在我们的案例中为反恐精英:全球攻势。请参阅Valve的开发Wiki以获取其他appid的列表,尽管此列表很可能总是过时,因为新应用程序经常被添加到他们的平台。

market_hash_name:包含外部查询项目的名称,查询用户库存时可以找到这些名称,但这是一个完整的其他API调用。

currency:整数值;货币价值和格式以返回市场价值。你需要调整和使用这些数字,因为我不能在这里提供太多细节。一般来说,我坚持使用美元作为全球价格,并使用我自己的货币API转换为其他货币。

答案 1 :(得分:4)

不要使用正则表达式执行此任务(请参阅RegEx match open tags except XHTML self-contained tags,但在SO上某处有更多解释性链接)

您希望使用XPath根据精细条件选择元素。从PHP.net开始,这可以为您提供所需的节点:

$doc = new DOMDocument();
$doc->loadHTMLFile($file);
$xpath = new DOMXpath($doc);

$elements = $xpath->query('//span[@class="market_listing_price market_listing_price_with_fee"]');

XPath //span[@class="..."]表示选择文档中具有预期类属性的所有span标记。

答案 2 :(得分:0)

我通过npm为cs:go market创建了一个node.js模块。 https://www.npmjs.com/package/csgo-market目前仅提供单一价格,但如果您希望我添加其他功能,请与我们联系。