str_replace 在 PHP 中似乎不起作用

str_replace in PHP does not seem to work

我正在尝试从我们的中央银行获取一些数据,但无法计算出来。 (当然,他们不提供支持...)

$client = new SoapClient("http://www.mnb.hu/arfolyamok.asmx?wsdl",array('trace' => 1));
$xml = new SimpleXMLElement($client->GetCurrentExchangeRates()->GetCurrentExchangeRatesResult);
echo $client->GetCurrentExchangeRates()->GetCurrentExchangeRatesResult;
echo (string)htmlentities($client->__getLastResponse());

我得到的结果是:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<GetCurrentExchangeRatesResponse xmlns="http://www.mnb.hu/webservices/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <GetCurrentExchangeRatesResult>
    &lt;MNBCurrentExchangeRates&gt;
      &lt;Day date="2017-05-25"&gt;
        &lt;Rate unit="1" curr="AUD"&gt;204,7&lt;/Rate&gt;
        &lt;Rate unit="1" curr="BGN"&gt;157,51&lt;/Rate&gt;
        &lt;Rate unit="1" curr="BRL"&gt;83,66&lt;/Rate&gt;
        &lt;Rate unit="1" curr="CAD"&gt;204,06&lt;/Rate&gt;
        &lt;Rate unit="1" curr="CHF"&gt;282,21&lt;/Rate&gt;
        &lt;Rate unit="1" curr="CNY"&gt;39,89&lt;/Rate&gt;
        &lt;Rate unit="1" curr="CZK"&gt;11,65&lt;/Rate&gt;
        &lt;Rate unit="1" curr="DKK"&gt;41,4&lt;/Rate&gt;
        &lt;Rate unit="1" curr="EUR"&gt;308,06&lt;/Rate&gt;
        &lt;Rate unit="1" curr="GBP"&gt;355,61&lt;/Rate&gt;
        &lt;Rate unit="1" curr="HKD"&gt;35,17&lt;/Rate&gt;
        &lt;Rate unit="1" curr="HRK"&gt;41,48&lt;/Rate&gt;
        &lt;Rate unit="100" curr="IDR"&gt;2,06&lt;/Rate&gt;
        &lt;Rate unit="1" curr="ILS"&gt;76,56&lt;/Rate&gt;
        &lt;Rate unit="1" curr="INR"&gt;4,24&lt;/Rate&gt;
        &lt;Rate unit="1" curr="ISK"&gt;2,73&lt;/Rate&gt;
        &lt;Rate unit="100" curr="JPY"&gt;245,13&lt;/Rate&gt;
        &lt;Rate unit="100" curr="KRW"&gt;24,49&lt;/Rate&gt;
        &lt;Rate unit="1" curr="MXN"&gt;14,89&lt;/Rate&gt;
        &lt;Rate unit="1" curr="MYR"&gt;64,07&lt;/Rate&gt;
        &lt;Rate unit="1" curr="NOK"&gt;32,92&lt;/Rate&gt;
        &lt;Rate unit="1" curr="NZD"&gt;192,59&lt;/Rate&gt;
        &lt;Rate unit="1" curr="PHP"&gt;5,5&lt;/Rate&gt;
        &lt;Rate unit="1" curr="PLN"&gt;73,67&lt;/Rate&gt;
        &lt;Rate unit="1" curr="RON"&gt;67,7&lt;/Rate&gt;
        &lt;Rate unit="1" curr="RSD"&gt;2,51&lt;/Rate&gt;
        &lt;Rate unit="1" curr="RUB"&gt;4,88&lt;/Rate&gt;
        &lt;Rate unit="1" curr="SEK"&gt;31,68&lt;/Rate&gt;
        &lt;Rate unit="1" curr="SGD"&gt;197,91&lt;/Rate&gt;
        &lt;Rate unit="1" curr="THB"&gt;8,01&lt;/Rate&gt;
        &lt;Rate unit="1" curr="TRY"&gt;76,91&lt;/Rate&gt;
        &lt;Rate unit="1" curr="UAH"&gt;10,43&lt;/Rate&gt;
        &lt;Rate unit="1" curr="USD"&gt;274,03&lt;/Rate&gt;
        &lt;Rate unit="1" curr="ZAR"&gt;21,23&lt;/Rate&gt;
      &lt;/Day&gt;
    &lt;/MNBCurrentExchangeRates&gt;
  </GetCurrentExchangeRatesResult>
</GetCurrentExchangeRatesResponse>

这不是很好处理。所以我用了:

$res = (string)htmlentities($client->__getLastResponse());
$res = str_replace("&lt;", "<", $res);
$res = str_replace("&gt;", ">", $res);
echo $res;

由于某种原因,结果是:

&lt;MNBCurrentExchangeRates&gt;
          &lt;Day date="2017-05-25"&gt;
            &lt;Rate unit="1" curr="AUD"&gt;204,7&lt;/Rate&gt;
            &lt;Rate unit="1" curr="BGN"&gt;157,51&lt;/Rate&gt;
            &lt;Rate unit="1" curr="BRL"&gt;83,66&lt;/Rate&gt;
            &lt;Rate unit="1" curr="CAD"&gt;204,06&lt;/Rate&gt;
            &lt;Rate unit="1" curr="CHF"&gt;282,21&lt;/Rate&gt;
            &lt;Rate unit="1" curr="CNY"&gt;39,89&lt;/Rate&gt;
            &lt;Rate unit="1" curr="CZK"&gt;11,65&lt;/Rate&gt;
            &lt;Rate unit="1" curr="DKK"&gt;41,4&lt;/Rate&gt;
            &lt;Rate unit="1" curr="EUR"&gt;308,06&lt;/Rate&gt;
            &lt;Rate unit="1" curr="GBP"&gt;355,61&lt;/Rate&gt;
            &lt;Rate unit="1" curr="HKD"&gt;35,17&lt;/Rate&gt;
            &lt;Rate unit="1" curr="HRK"&gt;41,48&lt;/Rate&gt;
            &lt;Rate unit="100" curr="IDR"&gt;2,06&lt;/Rate&gt;
            &lt;Rate unit="1" curr="ILS"&gt;76,56&lt;/Rate&gt;
            &lt;Rate unit="1" curr="INR"&gt;4,24&lt;/Rate&gt;
            &lt;Rate unit="1" curr="ISK"&gt;2,73&lt;/Rate&gt;
            &lt;Rate unit="100" curr="JPY"&gt;245,13&lt;/Rate&gt;
            &lt;Rate unit="100" curr="KRW"&gt;24,49&lt;/Rate&gt;
            &lt;Rate unit="1" curr="MXN"&gt;14,89&lt;/Rate&gt;
            &lt;Rate unit="1" curr="MYR"&gt;64,07&lt;/Rate&gt;
            &lt;Rate unit="1" curr="NOK"&gt;32,92&lt;/Rate&gt;
            &lt;Rate unit="1" curr="NZD"&gt;192,59&lt;/Rate&gt;
            &lt;Rate unit="1" curr="PHP"&gt;5,5&lt;/Rate&gt;
            &lt;Rate unit="1" curr="PLN"&gt;73,67&lt;/Rate&gt;
            &lt;Rate unit="1" curr="RON"&gt;67,7&lt;/Rate&gt;
            &lt;Rate unit="1" curr="RSD"&gt;2,51&lt;/Rate&gt;
            &lt;Rate unit="1" curr="RUB"&gt;4,88&lt;/Rate&gt;
            &lt;Rate unit="1" curr="SEK"&gt;31,68&lt;/Rate&gt;
            &lt;Rate unit="1" curr="SGD"&gt;197,91&lt;/Rate&gt;
            &lt;Rate unit="1" curr="THB"&gt;8,01&lt;/Rate&gt;
            &lt;Rate unit="1" curr="TRY"&gt;76,91&lt;/Rate&gt;
            &lt;Rate unit="1" curr="UAH"&gt;10,43&lt;/Rate&gt;
            &lt;Rate unit="1" curr="USD"&gt;274,03&lt;/Rate&gt;
            &lt;Rate unit="1" curr="ZAR"&gt;21,23&lt;/Rate&gt;
          &lt;/Day&gt;
        &lt;/MNBCurrentExchangeRates&gt;

这不仅仅是奇怪。我想清除这些 lt 和 gt 代码,但却丢失了输出中的 <> 部分。我想用 simplexml 获取数据,但无论我给它哪个输出,它都会返回 false。这是我想使用的代码,但现在它只给出错误消息,因为 $xml 的竞争是 "false";

$xml = simplexml_load_string( (string)$res );

  var_dump($xml);

  foreach($xml->xpath('//Day') as $header) {
    echo (string)$header->Rate;
  }

(它实际上在一行中给出了结果 XML,我只是整理了一下。)

Try this code snippet here

<?php

ini_set('display_errors', 1);

$string = <<<HTML

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<GetCurrentExchangeRatesResponse xmlns="http://www.mnb.hu/webservices/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <GetCurrentExchangeRatesResult>
    &lt;MNBCurrentExchangeRates&gt;
      &lt;Day date="2017-05-25"&gt;
        &lt;Rate unit="1" curr="AUD"&gt;204,7&lt;/Rate&gt;
        &lt;Rate unit="1" curr="BGN"&gt;157,51&lt;/Rate&gt;
        &lt;Rate unit="1" curr="BRL"&gt;83,66&lt;/Rate&gt;
        &lt;Rate unit="1" curr="CAD"&gt;204,06&lt;/Rate&gt;
        &lt;Rate unit="1" curr="CHF"&gt;282,21&lt;/Rate&gt;
        &lt;Rate unit="1" curr="CNY"&gt;39,89&lt;/Rate&gt;
        &lt;Rate unit="1" curr="CZK"&gt;11,65&lt;/Rate&gt;
        &lt;Rate unit="1" curr="DKK"&gt;41,4&lt;/Rate&gt;
        &lt;Rate unit="1" curr="EUR"&gt;308,06&lt;/Rate&gt;
        &lt;Rate unit="1" curr="GBP"&gt;355,61&lt;/Rate&gt;
        &lt;Rate unit="1" curr="HKD"&gt;35,17&lt;/Rate&gt;
        &lt;Rate unit="1" curr="HRK"&gt;41,48&lt;/Rate&gt;
        &lt;Rate unit="100" curr="IDR"&gt;2,06&lt;/Rate&gt;
        &lt;Rate unit="1" curr="ILS"&gt;76,56&lt;/Rate&gt;
        &lt;Rate unit="1" curr="INR"&gt;4,24&lt;/Rate&gt;
        &lt;Rate unit="1" curr="ISK"&gt;2,73&lt;/Rate&gt;
        &lt;Rate unit="100" curr="JPY"&gt;245,13&lt;/Rate&gt;
        &lt;Rate unit="100" curr="KRW"&gt;24,49&lt;/Rate&gt;
        &lt;Rate unit="1" curr="MXN"&gt;14,89&lt;/Rate&gt;
        &lt;Rate unit="1" curr="MYR"&gt;64,07&lt;/Rate&gt;
        &lt;Rate unit="1" curr="NOK"&gt;32,92&lt;/Rate&gt;
        &lt;Rate unit="1" curr="NZD"&gt;192,59&lt;/Rate&gt;
        &lt;Rate unit="1" curr="PHP"&gt;5,5&lt;/Rate&gt;
        &lt;Rate unit="1" curr="PLN"&gt;73,67&lt;/Rate&gt;
        &lt;Rate unit="1" curr="RON"&gt;67,7&lt;/Rate&gt;
        &lt;Rate unit="1" curr="RSD"&gt;2,51&lt;/Rate&gt;
        &lt;Rate unit="1" curr="RUB"&gt;4,88&lt;/Rate&gt;
        &lt;Rate unit="1" curr="SEK"&gt;31,68&lt;/Rate&gt;
        &lt;Rate unit="1" curr="SGD"&gt;197,91&lt;/Rate&gt;
        &lt;Rate unit="1" curr="THB"&gt;8,01&lt;/Rate&gt;
        &lt;Rate unit="1" curr="TRY"&gt;76,91&lt;/Rate&gt;
        &lt;Rate unit="1" curr="UAH"&gt;10,43&lt;/Rate&gt;
        &lt;Rate unit="1" curr="USD"&gt;274,03&lt;/Rate&gt;
        &lt;Rate unit="1" curr="ZAR"&gt;21,23&lt;/Rate&gt;
      &lt;/Day&gt;
    &lt;/MNBCurrentExchangeRates&gt;
  </GetCurrentExchangeRatesResult>
</GetCurrentExchangeRatesResponse>
</s:Body>
</s:Envelope>
HTML;
$xml= html_entity_decode($string);

$domDocument = new DOMDocument();
$domDocument->loadXML($xml);
$results=$domDocument->getElementsByTagName("Day");
foreach($results->item(0)->childNodes as $node)
{
    if($node instanceof DOMElement)
    {
        echo $node->nodeValue;
    }
}