MMGP logo
Присоединяйтесь к нашему инвестиционному форуму, на котором уже 642,414 пользователей. Чтобы получить доступ ко многим закрытым разделам и начать общение - зарегистрируйтесь прямо сейчас.
Все, что относится к Web-Программированию (PHP, Perl, JavaScript, MySQL, XML и т.д.)
Первый пост Опции темы
Старый 13.10.2011, 19:14
#1
Любитель
 
Пол: Мужской
Адрес: Киев
Инвестирую в: Свой бизнес
Регистрация: 15.05.2007
Сообщений: 796
Благодарностей: 87
Помогите разобраться с функцией в парсере

Есть функция парсера валют:
PHP код:
function delteg($string)
{
$keyp=0;
$out="";
       
$lenght=strlen($string);
           for (
$i=0$i<$lenght$i++)  {
               if (
$string[$i]=="<"):
                 
$keyp=1;
               endif;

               if (
$keyp==0):
                 
$out.=$string[$i];
               endif;

               if (
$string[$i]==">"):
                 
$keyp=0;
               endif;

       }
       
$out substr($out,0,strlen($out)-1);
       return 
$out;
}

$code = array(EUR);
$char3 = array();
$size = array();
$name = array();
$rate = array();
$change = array();

$n 0;

$handle fopen ("https://bank-ua.com/export/currrate.xml""r");
while (!
feof ($handle)) {
   
$buffer fgets($handle4096);
   if (
strpos($buffer"code")>0) ($code[$n]=delteg($buffer));
   if (
strpos($buffer"char3")>0) ($char3[$n]=delteg($buffer));
   if (
strpos($buffer"size")>0) ($size[$n]=delteg($buffer));
   if (
strpos($buffer"name")>0) ($name[$n]=delteg($buffer));
     if (
strpos($buffer"rate")>0) ($rate[$n]=delteg($buffer));
  if (
strpos($buffer"change")>0) :$change[$n]=delteg($buffer);
     
$n++;
   endif;


}
fclose ($handle);

for (
$i=0$i<$n$i++) {
if(
$char3[$i]=='EUR'){
if (
$change[$i]>0) {$change[$i]="Рост";}  
if (
$change[$i]<0) {$change[$i]="Уменьш";}
else {
$change[$i]="без";}   echo '<tr ><td align="center" width="40"><b>'.$char3[$i].'</b></td><td width="25"> '.$size[$i].' </td><td width="60" align="center"> '.$rate[$i].' </td><td align="center" width="50">'.$change[$i].'</td></tr>';  }} 
Суть задачи сделать так, чтоб в зависимости от значения изменения курса валюты воводилась зеленая, красная или черная стрелочки(в случае если изменения не произошло). Вроде бы все работает но при наличии условия else {$change[$i]="без";} - всегда выводится этот результат, то есть тображает, что курс не изменился! Что не так или как сделать этот скрипт рабочим?

добавлено через 33 минуты
При изменении условия на:
PHP код:
if ($change[$i]==0) {$change[$i]="без";} 
if (
$change[$i]>0) {$change[$i]="Рост";}   
if (
$change[$i]<0) {$change[$i]="Уменьш";} 
все заработало! В чем могла біть проблема?

Последний раз редактировалось OrlandO; 13.10.2011 в 19:48. Причина: Добавлено сообщение
OrlandO вне форума
Старый 13.10.2011, 21:50
#2
Топ Мастер
 
Пол: Мужской
Регистрация: 24.09.2007
Сообщений: 9,250
Благодарностей: 1,334

награды Волшебный горшочек Ветеран MMGP.RU 
Re: Помогите разобраться с функцией в парсере

Директива else относится только к одной директиве if (первой, которая стоит перед ней)...
В вашем первом примере :
Сначала срабатывал первый if
PHP код:
if ($change[$i]>0) {$change[$i]="Рост";} 
И если курс увеличился, и в переменную change записало значение Рост, то последующие if обрабатывать не нужно - Вы уже определили то что хотели...
А здесь что мы видим...
Всегда срабатывал следующий (второй) if
PHP код:
if ($change[$i]<0) {$change[$i]="Уменьш";} 
И else, который идет дальше, относится именно к этому if.
А так как я подозреваю что в Вашем примере курс именно увеличивался, то у Вас всегда срабатывала процедура else...
Т.е. в том варианте, как написано в первом примере - Вы никогда не увидите увеличение курса (зеленой стрелочки)... Всегда будет либо красная либо черная.

Второй пример более правильный...
Более - потому что он рабочий, но есть одно но... (хотя сейчас с современными компьютерами это и не критично)..
У Вас во втором примере будут обрабатываться все 3 строки (все 3 условия), даже если верный результат найдем сразу в первом условии..
Да, результат будет правильный, потому что следующие проверки не сработают, но попытка их обработать - будет...

Правильный вариант будет выглядеть вот так :
PHP код:
if ($change[$i]>0) {$change[$i]="Рост";}  
else if (
$change[$i]<0) {$change[$i]="Уменьш";}
else {
$change[$i]="без";} 
Здесь условия будут проверяться поочередно пока не найдем правильный вариант. Если правильный вариант будет найден в первом условии - то следующие 2 обрабатываться даже не будут..
Senator2 вне форума
Сказали спасибо:
OrlandO (20.10.2011)
Старый 20.10.2011, 16:16
#3
Любитель
 
Пол: Мужской
Адрес: Киев
Инвестирую в: Свой бизнес
Регистрация: 15.05.2007
Сообщений: 796
Благодарностей: 87
Автор темы Re: Помогите разобраться с функцией в парсере

Обязательно учту это !!! В ходе работы возникла проблема, почему -то скрипт парсера грузит весь сайт, а иногда вообще его вешает и браузер выдает ошибку 403.

крипт следующего вида:
PHP код:
<div class="contentholder">
<div class="contentslider"><table width="600" class="kurs" align="left"><tr> <div class="content"><?php

function delteg($string)
{
$keyp=0;
$out="";
       
$lenght=strlen($string);
           for (
$i=0$i<$lenght$i++)  {
               if (
$string[$i]=="<"):
                 
$keyp=1;
               endif;

               if (
$keyp==0):
                 
$out.=$string[$i];
               endif;

               if (
$string[$i]==">"):
                 
$keyp=0;
               endif;

       }
       
$out substr($out,0,strlen($out)-1);
       return 
$out;
}

$code = array(EUR);
$char3 = array();
$size = array();
$name = array();
$rate = array();
$change = array();

$n 0;

$handle fopen ("https://bank-ua.com/export/currrate.xml""r");
while (!
feof ($handle)) {
   
$buffer fgets($handle4096);
   if (
strpos($buffer"code")>0) ($code[$n]=delteg($buffer));
   if (
strpos($buffer"char3")>0) ($char3[$n]=delteg($buffer));
   if (
strpos($buffer"size")>0) ($size[$n]=delteg($buffer));
   if (
strpos($buffer"name")>0) ($name[$n]=delteg($buffer));
     if (
strpos($buffer"rate")>0) ($rate[$n]=delteg($buffer));
  if (
strpos($buffer"change")>0) :
     
$change[$n]=delteg($buffer);
     
$n++;
   endif;


}
fclose ($handle);

for (
$i=0$i<$n$i++) {
  if(
$char3[$i]=='EUR'){ 

if (
$change[$i]==0) {$change[$i]="&nbsp;&nbsp;<b>-</b>";} 
if (
$change[$i]>0) {$change[$i]=" <img src='https://finliga.com/images/up.png' width='9' height='10' alt='up'>";}   
if (
$change[$i]<0) {$change[$i]=" <img src='https://finliga.com/images/down.png' width='9' height='10' alt='down'>";} 
$rate[$i]=$rate[$i]/100;
   echo 
'<td align="left" width="71"><b>'.$char3[$i].'</b>&nbsp;'.round($rate[$i], 2).''.$change[$i].'</td>';
  }
    if(
$char3[$i]=='USD'){ 

if (
$change[$i]==0) {$change[$i]="&nbsp;&nbsp;<b>-</b>";} 
if (
$change[$i]>0) {$change[$i]=" <img src='https://finliga.com/images/up.png' width='9' height='10' alt='up'>";}   
if (
$change[$i]<0) {$change[$i]=" <img src='https://finliga.com/images/down.png' width='9' height='10' alt='down'>";} 
$rate[$i]=$rate[$i]/100;
   echo 
'<td align="left" width="64"><b>'.$char3[$i].'</b>&nbsp;'.round($rate[$i], 2).''.$change[$i].'</td>';
  }
    if(
$char3[$i]=='RUB'){ 

if (
$change[$i]==0) {$change[$i]="&nbsp;&nbsp;<b>-</b>";} 
if (
$change[$i]>0) {$change[$i]=" <img src='https://finliga.com/images/up.png' width='9' height='10' alt='up'>";}   
if (
$change[$i]<0) {$change[$i]="  <img src='https://finliga.com/images/down.png' width='9' height='10' alt='down'>";}
$rate[$i]=$rate[$i]/10
   echo 
'<td align="center" width="60"><b>'.$char3[$i].'</b>&nbsp;'.round($rate[$i], 2).''.$change[$i].'</td>';
  }
}  


?></div><div class="content"><td width="65">
<?php
 $yearyesterday 
date('Y');
  
$monthyesterday date('m');
  
$dayyesterday = (int)date('d') - 1;

$dateyesterday =$dayyesterday."/".$monthyesterday."/".$yearyesterday;
$fileyesterday file_get_contents ("https://www.cbr.ru/scripts/XML_daily.asp?date_req=".$dateyesterday);

$usdyesterday "R01235";


$filesyesterday ereg_replace("/\<ValCurs Date=\"$date\" name=\"Foreign Currency Market\"\>\n/is"""$fileyesterday);
$filesyesterday ereg_replace("/\<ValCurs\>\n/is"""$fileyesterday);


preg_match("/\<Valute ID=\"".$usdyesterday."\".*?\>(.*?)\<\/Valute\>/is"$fileyesterday$m); 
preg_match("/<Value>(.*?)<\/Value>/is"$m[1], $r);


$dollaryesterday str_replace(",""."$r[1]);

 
$year date('Y');
  
$month date('m');
  
$day = (int)date('d');

$date =$day."/".$month."/".$year;
$file file_get_contents ("https://www.cbr.ru/scripts/XML_daily.asp?date_req=".$date);

$usd "R01235";


$files ereg_replace("/\<ValCurs Date=\"$date\" name=\"Foreign Currency Market\"\>\n/is"""$file);
$files ereg_replace("/\<ValCurs\>\n/is"""$file);


preg_match("/\<Valute ID=\"".$usd."\".*?\>(.*?)\<\/Valute\>/is"$file$m); 
preg_match("/<Value>(.*?)<\/Value>/is"$m[1], $r);


$dollar str_replace(",""."$r[1]); 

if (
$dollar==$dollaryesterday) {$usdchange="&nbsp;<b>-</b>";} 
if (
$dollar>$dollaryesterday) {$usdchange=" <img src='https://finliga.com/images/up.png' width='9' height='10' alt='up'>";}   
if (
$dollar<$dollaryesterday) {$usdchange=" <img src='https://finliga.com/images/down.png' width='9' height='10' alt='down'>";} 
 
echo 
'<b>USD</b>&nbsp;'.round($dollar2).'&nbsp;'.$usdchange;
?>
<?php
 $yearyesterday 
date('Y');
  
$monthyesterday date('m');
  
$dayyesterday = (int)date('d') - 1;

$dateyesterday =$dayyesterday."/".$monthyesterday."/".$yearyesterday;
$fileyesterday file_get_contents ("https://www.cbr.ru/scripts/XML_daily.asp?date_req=".$dateyesterday);

$euryesterday "R01239";


$filesyesterday ereg_replace("/\<ValCurs Date=\"$date\" name=\"Foreign Currency Market\"\>\n/is"""$fileyesterday);
$filesyesterday ereg_replace("/\<ValCurs\>\n/is"""$fileyesterday);


preg_match("/\<Valute ID=\"".$euryesterday."\".*?\>(.*?)\<\/Valute\>/is"$fileyesterday$m); 
preg_match("/<Value>(.*?)<\/Value>/is"$m[1], $r);


$euryesterday str_replace(",""."$r[1]);

 
$year date('Y');
  
$month date('m');
  
$day = (int)date('d');

$date =$day."/".$month."/".$year;
$file file_get_contents ("https://www.cbr.ru/scripts/XML_daily.asp?date_req=".$date);

$eur "R01239";


$files ereg_replace("/\<ValCurs Date=\"$date\" name=\"Foreign Currency Market\"\>\n/is"""$file);
$files ereg_replace("/\<ValCurs\>\n/is"""$file);


preg_match("/\<Valute ID=\"".$eur."\".*?\>(.*?)\<\/Valute\>/is"$file$m); 
preg_match("/<Value>(.*?)<\/Value>/is"$m[1], $r);


$eur str_replace(",""."$r[1]); 

if (
$eur==$euryesterday) {$eurchange="&nbsp;<b>-</b>";} 
if (
$eur>$euryesterday) {$eurchange=" <img src='https://finliga.com/images/up.png' width='9' height='10' alt='up'>";}   
if (
$eur<$euryesterday) {$eurchange=" <img src='https://finliga.com/images/down.png' width='9' height='10' alt='down'>";} 
 
echo 
'<b>EUR</b>&nbsp;'.round($eur2).''.$eurchange;
?><?php
 $yearyesterday 
date('Y');
  
$monthyesterday date('m');
  
$dayyesterday = (int)date('d') - 1;

$dateyesterday =$dayyesterday."/".$monthyesterday."/".$yearyesterday;
$fileyesterday file_get_contents ("https://www.cbr.ru/scripts/XML_daily.asp?date_req=".$dateyesterday);

$uahyesterday "R01720";


$filesyesterday ereg_replace("/\<ValCurs Date=\"$date\" name=\"Foreign Currency Market\"\>\n/is"""$fileyesterday);
$filesyesterday ereg_replace("/\<ValCurs\>\n/is"""$fileyesterday);


preg_match("/\<Valute ID=\"".$uahyesterday."\".*?\>(.*?)\<\/Valute\>/is"$fileyesterday$m); 
preg_match("/<Value>(.*?)<\/Value>/is"$m[1], $r);


$uahyesterday str_replace(",""."$r[1]);

 
$year date('Y');
  
$month date('m');
  
$day = (int)date('d');

$date =$day."/".$month."/".$year;
$file file_get_contents ("https://www.cbr.ru/scripts/XML_daily.asp?date_req=".$date);

$uah "R01720";


$files ereg_replace("/\<ValCurs Date=\"$date\" name=\"Foreign Currency Market\"\>\n/is"""$file);
$files ereg_replace("/\<ValCurs\>\n/is"""$file);


preg_match("/\<Valute ID=\"".$uah."\".*?\>(.*?)\<\/Valute\>/is"$file$m); 
preg_match("/<Value>(.*?)<\/Value>/is"$m[1], $r);


$uah str_replace(",""."$r[1]); 

if (
$uah==$uahyesterday) {$uahchange="&nbsp;<b>-</b>";} 
if (
$uah>$uahyesterday) {$uahchange=" <img src='https://finliga.com/images/up.png' width='9' height='10' alt='up'>";}   
if (
$uah<$uahyesterday) {$uahchange=" <img src='https://finliga.com/images/down.png' width='9' height='10' alt='down'>";} 
 
echo 
'<b>UAH</b>&nbsp;'.round($uah2).''.$uahchange;
?>
<?php
 $yearyesterday 
date('Y');
  
$monthyesterday date('m');
  
$dayyesterday = (int)date('d') - 1;

$dateyesterday =$monthyesterday."/".$dayyesterday."/".$yearyesterday;
$fileyesterday file_get_contents ("https://www.nbrb.by/Services/XmlExRates.aspx?ondate=".$dateyesterday);

$usdyesterday "145";


$filesyesterday ereg_replace("/\<DailyExRates Date=\"$date\"\>\n/is"""$fileyesterday);
$filesyesterday ereg_replace("/\<DailyExRates\>\n/is"""$fileyesterday);


preg_match("/\<Currency Id=\"".$usdyesterday."\".*?\>(.*?)\<\/Currency\>/is"$fileyesterday$m); 
preg_match("/<Rate>(.*?)<\/Rate>/is"$m[1], $r);


$dollaryesterday str_replace(",""."$r[1]);

 
$year date('Y');
  
$month date('m');
  
$day = (int)date('d');

$date =$month."/".$day."/".$year;
$file file_get_contents ("https://www.nbrb.by/Services/XmlExRates.aspx?ondate=".$date);

$usd "145";


$files ereg_replace("/\<DailyExRates Date=\"$date\"\>\n/is"""$file);
$files ereg_replace("/\<DailyExRates\>\n/is"""$file);


preg_match("/\<Currency Id=\"".$usd."\".*?\>(.*?)\<\/Currency\>/is"$file$m); 
preg_match("/<Rate>(.*?)<\/Rate>/is"$m[1], $r);


$dollar str_replace(",""."$r[1]); 

if (
$dollar==$dollaryesterday) {$usdchange="&nbsp;<b>-</b>";} 
if (
$dollar>$dollaryesterday) {$usdchange=" <img src='https://finliga.com/images/up.png' width='9' height='10' alt='up'>";}   
if (
$dollar<$dollaryesterday) {$usdchange=" <img src='https://finliga.com/images/down.png' width='9' height='10' alt='down'>";} 
 
echo 
'<b>USD</b>&nbsp;'.round($dollar2).'&nbsp;'.$usdchange;
?>
<?php
 $yearyesterday 
date('Y');
  
$monthyesterday date('m');
  
$dayyesterday = (int)date('d') - 1;

$dateyesterday =$monthyesterday."/".$dayyesterday."/".$yearyesterday;
$fileyesterday file_get_contents ("https://www.nbrb.by/Services/XmlExRates.aspx?ondate=".$dateyesterday);

$euryesterday "19";


$filesyesterday ereg_replace("/\<DailyExRates Date=\"$date\"\>\n/is"""$fileyesterday);
$filesyesterday ereg_replace("/\<DailyExRates\>\n/is"""$fileyesterday);


preg_match("/\<Valute ID=\"".$euryesterday."\".*?\>(.*?)\<\/Valute\>/is"$fileyesterday$m); 
preg_match("/<Value>(.*?)<\/Value>/is"$m[1], $r);


$euryesterday str_replace(",""."$r[1]);

 
$year date('Y');
  
$month date('m');
  
$day = (int)date('d');

$date =$month."/".$day."/".$year;
$file file_get_contents ("https://www.nbrb.by/Services/XmlExRates.aspx?ondate=".$date);

$eur "19";


$files ereg_replace("/\<DailyExRates Date=\"$date\"\>\n/is"""$file);
$files ereg_replace("/\<DailyExRates\>\n/is"""$file);


preg_match("/\<Currency Id=\"".$eur."\".*?\>(.*?)\<\/Currency\>/is"$file$m); 
preg_match("/<Rate>(.*?)<\/Rate>/is"$m[1], $r);


$eur str_replace(",""."$r[1]); 

if (
$eur==$euryesterday) {$eurchange="&nbsp;<b>-</b>";} 
if (
$eur>$euryesterday) {$eurchange=" <img src='https://finliga.com/images/up.png' width='9' height='10' alt='up'>";}   
if (
$eur<$euryesterday) {$eurchange=" <img src='https://finliga.com/images/down.png' width='9' height='10' alt='down'>";} 
 
echo 
'<b>EU</b>&nbsp;'.round($eur4).''.$eurchange;
?><?php
 $yearyesterday 
date('Y');
  
$monthyesterday date('m');
  
$dayyesterday = (int)date('d') - 1;

$dateyesterday =$monthyesterday."/".$dayyesterday."/".$yearyesterday;
$fileyesterday file_get_contents ("https://www.nbrb.by/Services/XmlExRates.aspx?ondate=".$dateyesterday);

$rubyesterday "190";


$filesyesterday ereg_replace("/\<DailyExRates Date=\"$date\"\>\n/is"""$fileyesterday);
$filesyesterday ereg_replace("/\<DailyExRates\>\n/is"""$fileyesterday);


preg_match("/\<Valute ID=\"".$rubyesterday."\".*?\>(.*?)\<\/Valute\>/is"$fileyesterday$m); 
preg_match("/<Value>(.*?)<\/Value>/is"$m[1], $r);


$rubyesterday str_replace(",""."$r[1]);

 
$year date('Y');
  
$month date('m');
  
$day = (int)date('d');

$date =$month."/".$day."/".$year;
$file file_get_contents ("https://www.nbrb.by/Services/XmlExRates.aspx?ondate=".$date);

$rub "190";


$files ereg_replace("/\<DailyExRates Date=\"$date\"\>\n/is"""$file);
$files ereg_replace("/\<DailyExRates\>\n/is"""$file);


preg_match("/\<Currency Id=\"".$rub."\".*?\>(.*?)\<\/Currency\>/is"$file$m); 
preg_match("/<Rate>(.*?)<\/Rate>/is"$m[1], $r);


$rub str_replace(",""."$r[1]); 

if (
$rub==$rubyesterday) {$rubchange="&nbsp;<b>-</b>";} 
if (
$rub>$rubyesterday) {$rubchange=" <img src='https://finliga.com/images/up.png' width='9' height='10' alt='up'>";}   
if (
$rub<$rubyesterday) {$rubchange=" <img src='https://finliga.com/images/down.png' width='9' height='10' alt='down'>";} 
 
echo 
'<b>RU</b>&nbsp;'.round($rub2).''.$rubchange;
?>
OrlandO вне форума
Старый 21.10.2011, 10:46
#4
Топ Мастер
 
Пол: Мужской
Регистрация: 24.09.2007
Сообщений: 9,250
Благодарностей: 1,334

награды Волшебный горшочек Ветеран MMGP.RU 
Re: Помогите разобраться с функцией в парсере

OrlandO, конечно он будет грузить весь сайт не по детски..
В этом скрипте 13 вызовов чтения удаленных файлов..
Такой скрипт ни в коем случае нельзя вставлять прямо в тело сайта..
Только этот скрипт (приведенный Вами) будет работать (до выдачи результата) 6 секунд и больше. Это я указал среднее время замеренное мною. Были случаи что и 13 секунд работал. И думаю это еще не предел - всё будет зависеть от загруженности тех сайтов, которые Вы дергаете, интернет канала пользователя, который будет загружать страницу с этим скриптом и т.д.
Время работы PHP скрипта на сервере ограничено...
Оно указано в настройках PHP (на сервере) и обычно это 30-60 секунд.
Если в течении этого времени скрипт не отрабатывает - он сбрасывается - чтобы не вешать сервер..
Вот потому у Вас и происходит подобное...

Вообще-то - такие скрипты (которые могут работать достаточно длительное время) должны вызываться на странице (срабатывать) только после того, как сама страница уже отображена пользователю.
Вы наверняка видели на многих сайтах - после того как страница показана в браузере - начинают подгружаться какие-то блоки информации.
Если будет желание, почитайте по этому поводу (отложенная загрузка, Web 2.0, Ajax, jQuery) - оно как раз для таких случаев - для тяжелых скриптов...

А теперь - по самому скрипту...
Учитесь оптимизировать скрипты, которые Вы пишите...
Анализируйте написанный Вами код, и ищите способы ускорить его (оптимизировать). Нельзя просто брать и копировать куски кода - это в большинстве случаев неверно - и будет только увеличивать время работы скрипта, причем в основном - в разы...
Например...
- Вы с сайта cbr.ru и с сайта nbrb.by запрашиваете полный файл курсов на вчера и на сегодня для 3-х разных валют.
Это 12 обращений к внешним сайтам...
А зачем Вы это делаете ?
Ведь при запросе курсов валют на определенную дату в файле содержится информация по всем валютам... Зачем же его еще 2 раза запрашивать ?
Получается что то, что можно было сделать за один запрос - Вы делаете 3-мя запросами. Только это уже увеличивает время работы скрипта в 3 раза...
Для Вашего примера (3 валюты с 3-х сайтов) этот скрипт можно переделать следующим образом (так будет правильнее, немного компактнее, да и работать будет быстрее)..

И еще...
Советую Вам пересмотреть работу с этим скриптом.
А именно - не нужно постоянно обращаться к тем 3-м сайтам за данными.
Курсы ведь меняются один раз в день - так почему бы Вам, например, не сохранять считанные значения у себя в базе где-то...
При первой загрузке скрипта проверяете если данные за сегодня уже есть - то не обращаетесь к этим сайтам, а работаете со своими данными.
А если их еще нету - то зачитали один раз и сохранили в базе.
Таким образом этот скрипт будет работать еще быстрее...
В общем - подумайте над моими советами...

Ах да - вот и сам скрипт.
Работу его можете посмотреть здесь : https://www.libertykeeper.net.ua/testXml.php
PHP код:
<?php
    
// Валюты, которые мониторим
    
$aCurrencyName = array("USD","EUR","RUB","UAH","BYR");
    echo(
'<div align="center"><table width="80%">');
    
// Запрашиваем курсы валют с сайта bank-ua.com
    
$xml simplexml_load_file("https://bank-ua.com/export/currrate.xml");
    echo(
'<tr><td><b>bank-ua.com</b></td>');
    foreach (
$xml->item as $item)
    {
        
// Пройдемся по всем валютам
        
if (in_array($item->char3$aCurrencyName))
        {
            
// Если текущая валюта в списке тех, которая нам нужна - будем анализировать её
            
if ($item->change 0$txtChange '<img src="https://finliga.com/images/up.png" width="9" height="10" alt="up">';
            else if (
$item->change 0$txtChange '<img src="https://finliga.com/images/down.png" width="9" height="10" alt="up">';
            else 
$txtChange '&nbsp;&nbsp;<b>-</b>';
            
// Текущий курс валюты
            
$curRate floatval($item->rate) / floatval($item->size);
            
// Выведем результат
            
echo('<td align="center"><b>1 '.$item->char3.'</b> = '.number_format($curRate,4,'.','').' UAH '.$txtChange.'</td>');
        }
    }
    echo(
'</tr>');
    echo(
'<tr><td><b>cbr.ru</b></td>');
    
// Запрашиваем курсы валют с сайта cbr.ru
    // За вчерашний день
    
$dateYesterday date("d/m/Y"mktime(000date("m"), date("d")-1date("Y")));
    
$xmlYesterday simplexml_load_file("https://www.cbr.ru/scripts/XML_daily.asp?date_req=".$dateYesterday);
    
// За сегодняшний день
    
$dateToday date("d/m/Y");
    
$xmlToday simplexml_load_file("https://www.cbr.ru/scripts/XML_daily.asp?date_req=".$dateToday);
    foreach (
$xmlYesterday->Valute as $item)
    {
        
// Пройдемся по всем валютам
        
if (in_array($item->CharCode$aCurrencyName))
        {
            
// Если текущая валюта в списке тех, которая нам нужна - будем анализировать её
            // Найдем запись для текущей валюты в сегодняшних данных
            
$itemToday $xmlToday->xpath("Valute/CharCode[.='".$item->CharCode."']/parent::*"); 
            
// Т.к. у нас найдется только одна запись с таким же кодом, то будем брать всегда первую
            
$itemToday $itemToday[0];
            
// Заменим в значении Value запятую на точку.
            
$itemToday->Value = (preg_replace("/,/",".",$itemToday->Value));
            
// Определим как изменился курс (в какую сторону)
            
if (floatval($itemToday->Value) > floatVal($item->Value)) $txtChange '<img src="https://finliga.com/images/up.png" width="9" height="10" alt="up">';
            else if (
floatval($itemToday->Value) > floatVal($item->Value)) $txtChange '<img src="https://finliga.com/images/down.png" width="9" height="10" alt="up">';
            else 
$txtChange '&nbsp;&nbsp;<b>-</b>';
            
// Выведем результат
            
echo('<td align="center"><b>'.$itemToday->Nominal.' '.$itemToday->CharCode.'</b> = '.number_format(floatval($itemToday->Value),4,'.','').' RUB '.$txtChange.'</td>');
        }
    }
    echo(
'</tr>');
    echo(
'<tr><td><b>nbrb.by</b></td>');
    
// Запрашиваем курсы валют с сайта nbrb.by
    // За вчерашний день
    
$dateYesterday date("m/d/Y"mktime(000date("m"), date("d")-1date("Y")));
    
$xmlYesterday simplexml_load_file("https://www.nbrb.by/Services/XmlExRates.aspx?ondate=".$dateYesterday);
    
// За сегодняшний день
    
$dateToday date("m/d/Y");
    
$xmlToday simplexml_load_file("https://www.nbrb.by/Services/XmlExRates.aspx?ondate=".$dateToday);
    foreach (
$xmlYesterday->Currency as $item)
    {
        
// Пройдемся по всем валютам
        
if (in_array($item->CharCode$aCurrencyName))
        {
            
// Если текущая валюта в списке тех, которая нам нужна - будем анализировать её
            // Найдем запись для текущей валюты в сегодняшних данных
            
$itemToday $xmlToday->xpath("Currency/CharCode[.='".$item->CharCode."']/parent::*"); 
            
// Т.к. у нас найдется только одна запись с таким же кодом, то будем брать всегда первую
            
$itemToday $itemToday[0];
            
// Заменим в значении Value запятую на точку (если вдруг будет).
            
$itemToday->Rate = (preg_replace("/,/",".",$itemToday->Rate));
            
// Определим как изменился курс (в какую сторону)
            
if (floatval($itemToday->Rate) > floatVal($item->Rate)) $txtChange '<img src="https://finliga.com/images/up.png" width="9" height="10" alt="up">';
            else if (
floatval($itemToday->Rate) > floatVal($item->Rate)) $txtChange '<img src="https://finliga.com/images/down.png" width="9" height="10" alt="up">';
            else 
$txtChange '&nbsp;&nbsp;<b>-</b>';
            
// Выведем результат
            
echo('<td align="center"><b>'.$itemToday->Scale.' '.$itemToday->CharCode.'</b> = '.number_format(floatval($itemToday->Rate),4,'.','').' BYR '.$txtChange.'</td>');
        }
    }
    echo(
'</tr>');
    echo(
'</table></div>');
?>
Senator2 вне форума
Сказали спасибо:
OrlandO (23.10.2011)
Старый 23.10.2011, 17:13
#5
Любитель
 
Пол: Мужской
Адрес: Киев
Инвестирую в: Свой бизнес
Регистрация: 15.05.2007
Сообщений: 796
Благодарностей: 87
Автор темы Re: Помогите разобраться с функцией в парсере

Спсасибо большое, очень приятно, что есть люди которые могут вот так помочь. Я чесно-говоря сам понимал, что скорей всего причина в количестве запросов, но, к сожалению, не настолько опытен в этом, поэтому требовалось экспертное мнение! еще раз спасибо за очень подробное разьяснение!
OrlandO вне форума
Старый 22.11.2011, 15:37
#6
Любитель
 
Пол: Мужской
Адрес: Киев
Инвестирую в: Свой бизнес
Регистрация: 15.05.2007
Сообщений: 796
Благодарностей: 87
Автор темы Re: Помогите разобраться с функцией в парсере

Возникла еще одна проблема при парсинге. Спарсеные данные приходят в виде иероглифов, хот якодировка нормальная ! Что можно сделать в данной ситуации?
Вот код:
PHP код:
 if ($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"] != ""){ 
$IP $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"]; 
$proxyip $HTTP_SERVER_VARS["REMOTE_ADDR"]; 
}else{ 
$IP $HTTP_SERVER_VARS["REMOTE_ADDR"]; 

$url 'https://ipgeobase.ru:7020/geo?ip='.$IP

$xmlsimplexml_load_file($url);      
foreach (
$xml as $item)
 {
 
$gorod $item->city;
        echo 
$gorod
OrlandO вне форума
Старый 22.11.2011, 16:04
#7
 
Пол: Мужской
Инвестирую в: Свой бизнес
Регистрация: 13.12.2006
Сообщений: 5,553
Благодарностей: 3,381

награды Ветеран MMGP.RU Волшебный горшочек 
Re: Помогите разобраться с функцией в парсере

а иероглифы какие?
dkameleon вне форума
Старый 22.11.2011, 17:02
#8
Любитель
 
Пол: Мужской
Адрес: Киев
Инвестирую в: Свой бизнес
Регистрация: 15.05.2007
Сообщений: 796
Благодарностей: 87
Автор темы Re: Помогите разобраться с функцией в парсере

Киев - это, например, так Киев отображается!
OrlandO вне форума
Старый 22.11.2011, 17:06
#9
 
Пол: Мужской
Инвестирую в: Свой бизнес
Регистрация: 13.12.2006
Сообщений: 5,553
Благодарностей: 3,381

награды Ветеран MMGP.RU Волшебный горшочек 
Re: Помогите разобраться с функцией в парсере

Цитата:
Сообщение от OrlandO Посмотреть сообщение
Киев - это, например, так Киев отображается!
это не битые. просто в ЮТФ-8 кодировке.
если нужно в анси, то можно конвертнуть:
$str1251 = mb_convert_encoding('Киев', 'windows-1251', 'utf-8');
dkameleon вне форума
Старый 22.11.2011, 20:15
#10
Любитель
 
Пол: Мужской
Адрес: Киев
Инвестирую в: Свой бизнес
Регистрация: 15.05.2007
Сообщений: 796
Благодарностей: 87
Автор темы Re: Помогите разобраться с функцией в парсере

Просто банально подставить в эту функцию переменную которую надо конвертнуть?
OrlandO вне форума
Старый 22.11.2011, 20:55
#11
 
Пол: Мужской
Инвестирую в: Свой бизнес
Регистрация: 13.12.2006
Сообщений: 5,553
Благодарностей: 3,381

награды Ветеран MMGP.RU Волшебный горшочек 
Re: Помогите разобраться с функцией в парсере

Цитата:
echo mb_convert_encoding($gorod, 'windows-1251', 'utf-8');

пробуйте так
dkameleon вне форума
Сказали спасибо:
OrlandO (22.11.2011)
Старый 23.11.2011, 14:36
#12
Любитель
 
Пол: Мужской
Адрес: Киев
Инвестирую в: Свой бизнес
Регистрация: 15.05.2007
Сообщений: 796
Благодарностей: 87
Автор темы Re: Помогите разобраться с функцией в парсере

Спасибо, работает! Странно, что анные передавали!сь в кодировке ЮТФ, ведь в ХМЛ файле кодировка была указана как windows-1251'
OrlandO вне форума
Старый 24.11.2011, 01:51
#13
 
Пол: Мужской
Инвестирую в: Свой бизнес
Регистрация: 13.12.2006
Сообщений: 5,553
Благодарностей: 3,381

награды Ветеран MMGP.RU Волшебный горшочек 
Re: Помогите разобраться с функцией в парсере

Цитата:
Сообщение от OrlandO Посмотреть сообщение
Спасибо, работает! Странно, что анные передавали!сь в кодировке ЮТФ, ведь в ХМЛ файле кодировка была указана как windows-1251'
это так могут некоторые парсеры работать, по умолчанию обычно ютф.
может порсер хмл и сконвертил сам.
dkameleon вне форума
Старый 18.12.2011, 14:18
#14
Профессионал
 
Пол: Мужской
Инвестирую в: желания
Регистрация: 03.03.2009
Сообщений: 3,059
Благодарностей: 314
Re: Помогите разобраться с функцией в парсере

парсеры xml встроенные в пхп ВСЕГДА работают только с utf-8
smuglyanka вне форума
Старый 19.12.2011, 00:34
#15
 
Пол: Мужской
Инвестирую в: Свой бизнес
Регистрация: 13.12.2006
Сообщений: 5,553
Благодарностей: 3,381

награды Ветеран MMGP.RU Волшебный горшочек 
Re: Помогите разобраться с функцией в парсере

Цитата:
Сообщение от smuglyanka Посмотреть сообщение
парсеры xml встроенные в пхп ВСЕГДА работают только с utf-8
а много там встроеных?
dkameleon вне форума
Старый 19.12.2011, 05:49
#16
Любитель
 
Пол: Мужской
Адрес: Киев
Инвестирую в: Свой бизнес
Регистрация: 15.05.2007
Сообщений: 796
Благодарностей: 87
Автор темы Re: Помогите разобраться с функцией в парсере

Может быть функции парсеров, работающих на пхп?
OrlandO вне форума
Войдите, чтобы оставить комментарий.
Быстрый переход
Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться! Антон Красотин Liberty Reserve 10 04.02.2011 20:01
Помогите разобраться. wz25y Liberty Reserve 1 07.01.2010 11:11
Помогите разобраться Sutyurij Самое разное 8 04.04.2009 15:53
Помогите разобраться Василий Ивановичь Каталог Брокеров на Форекс 13 21.01.2009 19:43