2

外部の html コンテンツを取得する必要があるときに常に機能するコードを使用していましたが、昨日からコードが機能しなくなりました。

コード設定はこちら

ini_set('display_errors', 1);
$url ='https://www3.bcb.gov.br/ptax_internet/consultarTodasAsMoedas.do?method=consultaTodasMoedas';
$site = file_get_contents($url);

このリンクは、ブラジル中央銀行の通貨コンバーターで、毎日更新されます (営業日)。

このページから USD と EUR の値を取得する必要があります。テーブル内の値を取得しようとすると空が返されますが、div 内の値を取得するとすべてが期待どおりに機能します。

ソースコードのページに行くと、次のことがわかります。

<tr class="fundoPadraoBClaro2">
     <td align="CENTER">220</td>
     <td align="CENTER">A</td>
     <td align="CENTER">USD</td>
     <td align="right">2,2743</td>
     <td align="right">2,2748</td>
     <td align="right">1,0000</td>
     <td align="right">1,0000</td>
</tr>

ドル値を取得するには、次を使用します。

$data1 = explode('<td align="CENTER">USD</td><td align="right">', $site);
$data2 = explode('</td>',$data1[1]);
$usd = $data2[0];

しかし、これは空の値を返します。

しかし、同じコードを使用して DIV 内のコンテンツを取得すると、すべて正常に機能します。

ソースコード:

<div align="center">
    <strong>Cotações de todas as moedas no dia 09/08/2013 às 13:00 (horário de Brasília), conforme fechamento PTAX.</strong>
</div>

PHP コード:

$data1 = explode('todas as moedas no dia', $site);
$data2 = explode('conforme fechamento PTAX.',$data1[1]);
$result = $data2[0];

期待どおりの結果が得られました - 「2013 年 9 月 8 日 13:00 (ブラジリアの時間)」

私が欠けているものを誰か教えてもらえますか?

4

2 に答える 2

3

<td align="CENTER">USD</td>問題は、との間の空白<td align="right">を考慮していないことです。

これは、文字列操作の代わりに正規表現を使用するのに最適な状況です:

コード

$matches = array();
if (preg_match("/USD<\\/td>\\s+<td[^>]*>(?<usd_value>[0-9,.-]*)<\\/td>/i", $site, $matches))
    echo $matches["usd_value"];

正規表現は、 、空白、タグのUSD順で検索します。それと次の間の数字のように見えるものはすべて、名前の付いたグループに取り込まれます</td><td...><td...></td>usd_value

出力

2,2743
于 2013-08-10T19:18:27.137 に答える
1

エラーが見つかりました: $data2 = explode('</td>',$data[1]);

次のようにする必要があります。

$data2 = explode('</td>',$data1[1]);

于 2013-08-10T19:07:23.290 に答える