使用 file_get_contents 并使用内容的特定部分

Posted

技术标签:

【中文标题】使用 file_get_contents 并使用内容的特定部分【英文标题】:Using file_get_contents and use specific parts of the content 【发布时间】:2012-03-29 15:55:13 【问题描述】:

我正在尝试从另一个网站获取一些汇率,我正在登录并使用 file_get_contents 获取所有数据,这就是我使用的:

<?php
$username = 'myusername@gmail.com';
$password = 'mypassword';
$url = 'http://website-i-get-content-from.com';
$context = stream_context_create(array(
    'http' => array(
        'header'  => "Authorization: Basic " . base64_encode("$username:$password")
    )
));
$data = file_get_contents($url, false, $context)

?>

现在我只需要该网站的某些部分:EUR CHF 和 GBP 的汇率,在源代码中如下所示:

<tr><td>EUR</td><td align=right>USD 0.599</td><td align=right>USD 0.599</td></tr>

    <tr><td>CHF</td><td align=right>USD 0.470</td><td align=right>USD 0.470</td></tr>

    <tr><td>GBP</td><td align=right>USD 0.675</td><td align=right>USD 0.675</td></tr>

所以 0.599、0.470 和 0.675 是我此时需要的数字。它们确实发生了明显的变化。

如何将它们放入变量中?

【问题讨论】:

html Scraping in Php 的可能重复项 【参考方案1】:

听起来你需要一个解析器。我过去使用过simpledom parser。我发现它很简单。

include("simplehtmldom/simple_html_dom.php");

$data="<html>
<body>
<table class=\"foo\">
<tr><td>EUR</td><td align=right>USD 0.599</td><td align=right>USD
0.599</td></tr>
    <tr><td>CHF</td><td align=right>USD 0.470</td><td align=right>USD
0.470</td></tr>
    <tr><td>GBP</td><td align=right>USD 0.675</td><td align=right>USD
0.675</td></tr>
</table>
</body>
</html>";

$html = new simple_html_dom();
$html->load($data);

foreach($html->find('table.foo tr') as $row) 
  $cells = $row->find('td');
  if (count($cells) >= 3) 
    $abbr=$cells[0]->innertext; // EUR, CHF etc
    $value1=$cells[1]->innertext; // USD 0.599 etc
    $value2=$cells[2]->innertext; // USD 0.599 etc
    echo "$abbr $value1 $value2\n";
  

【讨论】:

PHP 有 (DOMDocument)[php.net/manual/en/book.dom.php],做同样的事情,不需要另一个库。 Adam,感谢您抽出宝贵时间提供帮助,您的回答对我来说很有意义,尽管我从中获取数据的网站包含的内容比您 $data 变量中的内容要多得多.我知道这只是一个起点,但你能告诉我如何从页面的整个源代码中提取你在 $data 变量中的部分吗?【参考方案2】:

正则表达式可以做到。

preg_match_all("'(EUR|CHF|GBP)(?=&lt;).+USD(?&lt;=&gt;)\s+([\d.]+)(?=&lt;)'", file_get_contents('...'), $matches));

虽然我没有测试它。

我知道解析 HTML 很糟糕,但这里并没有真正解析。

【讨论】:

以上是关于使用 file_get_contents 并使用内容的特定部分的主要内容,如果未能解决你的问题,请参考以下文章

为啥 file_get_contents 比 memcache_get 快?

Laravel ErrorException 使用 file_get_contents()

是否可以使用 file_get_contents() 或 cURL 进行代理?

file_get_contents() 分解 UTF-8 字符

file_get_contents() 是不是有超时设置?

url 不存在时的 file_get_contents