使用PHP和Regex在Steam社区市场上获取商品的价格
我正在尝试使用PHP来获取Steam社区项目的市场价格。我获取一个url(例如:),然后使用使用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
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€ ",
"volume": "562",
"median_price": "1,60€ "
}
JSON响应:
{
"success": true,
"lowest_price": "1,43€ ",
"volume": "562",
"median_price": "1,60€ "
}
响应定义:
success
:布尔值,如果呼叫成功,则为true;如果出现问题或Steam市场上没有该商品的上市,则为false
最低价格
:根据指定的查询参数,挂起货币符号[pre-/ap]的字符串值。有关其他参数,请参见下文
volume
:以字符串形式返回的整数值(?)-此特定项目已售出/购买的总数
中间价
:挂起货币符号[pre-/ap]的字符串值。商品的平均售价。有关如何计算中值的更好理解,请参见项目图
查询参数:
{
"success": true,
"lowest_price": "1,43€ ",
"volume": "562",
"median_price": "1,60€ "
}
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