Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP和Regex在Steam社区市场上获取商品的价格_Php_Regex_Steam - Fatal编程技术网

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

使用PHP和Regex在Steam社区市场上获取商品的价格,php,regex,steam,Php,Regex,Steam,我正在尝试使用PHP来获取Steam社区项目的市场价格。我获取一个url(例如:),然后使用file\u get\u contents()下载内容。我试着用这个: function getInnerHTML($string, $tagname, $closetagname) { $pattern = "/<$tagname ?.*>(.*)<\/$closetagname>/"; preg_match($pattern, $string, $matches

我正在尝试使用PHP来获取Steam社区项目的市场价格。我获取一个url(例如:),然后使用
file\u get\u contents()
下载内容。我试着用这个:

function getInnerHTML($string, $tagname, $closetagname) {
    $pattern = "/<$tagname ?.*>(.*)<\/$closetagname>/";
    preg_match($pattern, $string, $matches);
    return $matches[1];
}
我可以使用文件内容的一个例子是:

<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>

$1.92               
$1.68               

但它什么也不返回


有人有什么想法吗?

不要使用正则表达式来完成此任务(请参阅,但此处有更详细的说明链接)

您希望使用XPath根据良好的条件选择元素。从中可以获得所需的节点:

$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=“…”]
意味着在文档中选择所有具有预期class属性的
span
标记。

不完全确定当存在返回JSON的完美工作调用时,为什么要通过HTML和正则表达式艰难地执行此操作。虽然最初的答案是正确的,并且直接回答了OP问题,但这提供了一种更简单、更有效的获取商品市场价值的方法

获取

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

JSON响应

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

success
:布尔值,如果呼叫成功,则为true;如果出现问题或Steam市场上没有该商品的上市,则为false

最低价格
:根据指定的查询参数,挂起货币符号[pre-/ap]的字符串值。有关其他参数,请参见下文

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

中间价
:挂起货币符号[pre-/ap]的字符串值。商品的平均售价。有关如何计算中值的更好理解,请参见项目图

查询参数

{
  "success": true,
  "lowest_price": "1,43&#8364; ",
  "volume": "562",
  "median_price": "1,60&#8364; "
}
appid
:游戏/应用程序的唯一(静态定义)Steam应用程序ID,在我们的案例中是730,用于反击:全球进攻。查看Valve的development Wiki以获得其他appid的列表,尽管该列表很可能总是过时的,因为新的应用程序经常添加到他们的平台上

market\u hash\u name
:要查询的项目的名称,包括外部,在查询用户库存时可以找到这些名称,但这是另一个API调用

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


这是一个未记录的端点,因此可能不是永久性的,或者可能会发生更改,没有人知道。我通过npm为cs:go market创建了一个node.js模块。目前它只提供单一价格,但请告诉我您是否希望我添加其他功能。

您在表达式中使用了
*>(.*)
,而不是非贪婪模式,并且忘记了
s
修饰符。很明显,您需要停止使用正则表达式,并使用一个您不应该使用正则表达式来完成此任务,请尝试使用PHP的DOM:我尝试了PHP的DOM,但我不能使用它,因为列表中的每个项目在跨度中都有title属性,每个项目的title属性不同,title就是价格。“所以我不知道。”扎克伯格:我不知道你的意思。您能编辑您的问题以添加示例输入吗?好的,我刚刚添加了一个示例HTML代码。@Robin我正在尝试类似于OP的内容。我希望分析的数据。可以在这样的文本字符串上使用XPath吗。或者我需要先把它做成一种文件,然后才能对它进行查询?@Ríomhaire:如果你还有其他问题,你可以把它作为一种文件发布,这样会得到更多的支持。但在此之前,我建议您尝试一下,找出哪些工作符合预期,哪些不符合预期,以澄清您的确切问题!有没有一种方法可以获取多个项目的定价,而不是每个项目发送一个获取价格的请求?没有,但请看我对同一个问题的回答:@snh嘿,你能告诉我这个中间价是多少吗?因为几乎没有项目有它们,也没有项目。我已经用更多的信息更新了我的答案。@Stevosaurus,美元的币值是多少?货币3又回到了我的身上,欧元。伙计,这太酷了:啊,要是我知道任何关于nodejs的事就好了C