Часто возникает вопрос как разместить в системе умного дома информацию, которая размещена на стороннем сайте. Это может быть любая информация, гороскопы, прогноз погоды, курсы валют, различные публичные датчики и многое другое. Имеющиеся в системе Majordomo вэб-переменные не совсем удобны, не позволяют проводить групповую обработку данных. Я решил пойти своим путём и написать свой скрипт, который позволяет скачивать нужную вэб страничку, проводить поиск нужной информации и записывать её в нужные свойства объектов.
Алгоритм работы скрипта таков: сначала скачиваем текст выбранной вэб странички в переменную, потом проводим поиск нужной информации в этой переменной.
Для захвата исходного кода нужной вэб страницы, на просторах github я нашёл php подходящий код. Код содержит функцию, при запросе которой с параметром, в качестве которого указана ссылка на веб страницу, в ответе получаем исходный кож этой страницы.
А далее средствами php ищем по шаблону нужные данные в этом коде.
Рассмотрим работу скрипта на примере сайта курса валют, из которого требуется отфильтровать цены покупок и продаж валюты, а так же время обновления данных.
Заходим в раздел Объекты/Сценарии. Создаём новый сценарий. Вписываем ниже приведённый код:
Показать
Скрыть
function get_remote_data($url, $post_paramtrs=false, $extra=array('schemeless'=>true, 'replace_src'=>true, 'return_array'=>false, "curl_opts"=>[])) { $c = curl_init(); curl_setopt($c, CURLOPT_URL, $url); curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); //if parameters were passed to this function, then transform into POST method.. (if you need GET request, then simply change the passed URL) if($post_paramtrs){ curl_setopt($c, CURLOPT_POST,TRUE); curl_setopt($c, CURLOPT_POSTFIELDS, (is_array($post_paramtrs)? http_build_query($post_paramtrs) : $post_paramtrs) ); } curl_setopt($c, CURLOPT_SSL_VERIFYHOST,false); curl_setopt($c, CURLOPT_SSL_VERIFYPEER,false); curl_setopt($c, CURLOPT_COOKIE, 'CookieName1=Value;'); $headers[]= "User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:76.0) Gecko/20100101 Firefox/76.0"; $headers[]= "Pragma: "; $headers[]= "Cache-Control: max-age=0"; if (!empty($post_paramtrs) && !is_array($post_paramtrs) && is_object(json_decode($post_paramtrs))){ $headers[]= 'Content-Type: application/json'; $headers[]= 'Content-Length: '.strlen($post_paramtrs); } curl_setopt($c, CURLOPT_HTTPHEADER, $headers); curl_setopt($c, CURLOPT_MAXREDIRS, 10); //if SAFE_MODE or OPEN_BASEDIR is set,then FollowLocation cant be used.. so... $follow_allowed= ( ini_get('open_basedir') || ini_get('safe_mode')) ? false:true; if ($follow_allowed){curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1);} curl_setopt($c, CURLOPT_CONNECTTIMEOUT, 9); curl_setopt($c, CURLOPT_REFERER, $url); curl_setopt($c, CURLOPT_TIMEOUT, 60); curl_setopt($c, CURLOPT_AUTOREFERER, true); curl_setopt($c, CURLOPT_ENCODING, 'gzip,deflate'); curl_setopt($c, CURLOPT_HEADER, !empty($extra['return_array'])); //set extra options if passed if(!empty($extra['curl_opts'])) foreach($extra['curl_opts'] as $key=>$value) curl_setopt($c, constant($key), $value); $data = curl_exec($c); if(!empty($extra['return_array'])) { preg_match("/(.*?)\r\n\r\n((?!HTTP\/\d\.\d).*)/si",$data, $x); preg_match_all('/(.*?): (.*?)\r\n/i', trim('head_line: '.$x[1]), $headers_, PREG_SET_ORDER); foreach($headers_ as $each){ $header[$each[1]] = $each[2]; } $data=trim($x[2]); } $status=curl_getinfo($c); curl_close($c); // if redirected, then get that redirected page if($status['http_code']==301 || $status['http_code']==302) { //if we FOLLOWLOCATION was not allowed, then re-get REDIRECTED URL //p.s. WE dont need "else", because if FOLLOWLOCATION was allowed, then we wouldnt have come to this place, because 301 could already auto-followed by curl :) if (!$follow_allowed){ //if REDIRECT URL is found in HEADER if(empty($redirURL)){if(!empty($status['redirect_url'])){$redirURL=$status['redirect_url'];}} //if REDIRECT URL is found in RESPONSE if(empty($redirURL)){preg_match('/(Location:|URI:)(.*?)(\r|\n)/si', $data, $m); if (!empty($m[2])){ $redirURL=$m[2]; } } //if REDIRECT URL is found in OUTPUT if(empty($redirURL)){preg_match('/moved\s\<a(.*?)href\=\"(.*?)\"(.*?)here\<\/a\>/si',$data,$m); if (!empty($m[1])){ $redirURL=$m[1]; } } //if URL found, then re-use this function again, for the found url if(!empty($redirURL)){$t=debug_backtrace(); return call_user_func( $t[0]["function"], trim($redirURL), $post_paramtrs);} } } // if not redirected,and nor "status 200" page, then error.. elseif ( $status['http_code'] != 200 ) { $data = "ERRORCODE22 with $url<br/><br/>Last status codes:".json_encode($status)."<br/><br/>Last data got:$data";} //URLS correction if(function_exists('url_corrections_for_content_HELPER')){ $data= url_corrections_for_content_HELPER($data, $status['url'], array('schemeless'=>!empty($extra['schemeless']), 'replace_src'=>!empty($extra['replace_src']), 'rawgit_replace'=>!empty($extra['rawgit_replace']) ) ); } $answer = ( !empty($extra['return_array']) ? array('data'=>$data, 'header'=>$header, 'info'=>$status) : $data); return $answer; } function url_corrections_for_content_HELPER( $content=false, $url=false, $extra_opts=array('schemeless'=>false, 'replace_src'=>false, 'rawgit_replace'=>false) ) { $GLOBALS['rdgr']['schemeless'] =$extra_opts['schemeless']; $GLOBALS['rdgr']['replace_src']=$extra_opts['replace_src']; $GLOBALS['rdgr']['rawgit_replace']=$extra_opts['rawgit_replace']; if($GLOBALS['rdgr']['schemeless'] || $GLOBALS['rdgr']['replace_src'] ) { if($url) { $GLOBALS['rdgr']['parsed_url'] = parse_url($url); $GLOBALS['rdgr']['urlparts']['domain_X']= $GLOBALS['rdgr']['parsed_url']['scheme'].'://'.$GLOBALS['rdgr']['parsed_url']['host']; $GLOBALS['rdgr']['urlparts']['path_X'] = stripslashes(dirname($GLOBALS['rdgr']['parsed_url']['path']).'/'); $GLOBALS['rdgr']['all_protocols']= array('adc','afp','amqp','bacnet','bittorrent','bootp','camel','dict','dns','dsnp','dhcp','ed2k','empp','finger','ftp','gnutella','gopher','http','https','imap','irc','isup','javascript','ldap','mime','msnp','map','modbus','mosh','mqtt','nntp','ntp','ntcip','openadr','pop3','radius','rdp','rlogin','rsync','rtp','rtsp','ssh','sisnapi','sip','smtp','snmp','soap','smb','ssdp','stun','tup','telnet','tcap','tftp','upnp','webdav','xmpp'); } $GLOBALS['rdgr']['ext_array'] = array( 'src' => array('audio','embed','iframe','img','input','script','source','track','video'), 'srcset'=> array('source'), 'data' => array('object'), 'href' => array('link','area','a'), 'action'=> array('form') //'param', 'applet' and 'base' tags are exclusion, because of a bit complex structure ); $content= preg_replace_callback( '/<(((?!<).)*?)>/si', //avoids unclosed & closing tags function($matches_A){ $content_A = $matches_A[0]; $tagname = preg_match('/((.*?)(\s|$))/si', $matches_A[1], $n) ? $n[2] : ""; foreach($GLOBALS['rdgr']['ext_array'] as $key=>$value){ if(in_array($tagname,$value)){ preg_match('/ '.$key.'=(\'|\")/i', $content_A, $n); if(!empty($n[1])){ $GLOBALS['rdgr']['aphostrope_type']= $n[1]; $content_A = preg_replace_callback( '/( '.$key.'='.$GLOBALS['rdgr']['aphostrope_type'].')(.*?)('.$GLOBALS['rdgr']['aphostrope_type'].')/i', function($matches_B){ $full_link = $matches_B[2]; //correction to files/urls if(!empty($GLOBALS['rdgr']['replace_src']) ){ //if not schemeless url if(substr($full_link, 0,2) != '//'){ $replace_src_allow=true; //check if the link is a type of any special protocol foreach($GLOBALS['rdgr']['all_protocols'] as $each_protocol){ //if protocol found - dont continue if(substr($full_link, 0, strlen($each_protocol)+1) == $each_protocol.':'){ $replace_src_allow=false; break; } } if($replace_src_allow){ $full_link = $GLOBALS['rdgr']['urlparts']['domain_X']. (str_replace('//','/', $GLOBALS['rdgr']['urlparts']['path_X'].$full_link) ); } } } //replace http(s) with sheme-less urls if(!empty($GLOBALS['rdgr']['schemeless'])){ $full_link=str_replace( array('https://','http://'), '//', $full_link); } //replace github mime if(!empty($GLOBALS['rdgr']['rawgit_replace'])){ $full_link= str_replace('//raw.github'.'usercontent.com/','//rawgit.com/', $full_link); } $matches_B[2]=$full_link; unset($matches_B[0]); $content_B=''; foreach ($matches_B as $each){$content_B .= $each; } return $content_B; }, $content_A ); } } } return $content_A; }, $content ); $content= preg_replace_callback( '/style="(.*?)background(\-image|)(.*?|)\:(.*?|)url\((\'|\"|)(.*?)(\'|\"|)\)/i', function($matches_A){ $url = $matches_A[7]; $url = (substr($url,0,2)=='//' || substr($url,0,7)=='http://' || substr($url,0,8)=='https://' ? $url : '#'); return 'style="'.$matches_A[1].'background'.$matches_A[2].$matches_A[3].':'.$matches_A[4].'url('.$url.')'; //$matches_A[5] is url taged ,7 is url }, $content ); } return $content;}
Для того, что бы этот код поместил в заданную переменную исходный код нужной страницы, требуется написать запрос, в качестве параметра которого требуется указать путь до вэб страницы. Заходим на нужную страницу и копируем адрес ссылки.
Запрос будет выглядеть так:
Показать
Скрыть
$src=get_remote_data("https://pomenyay.kz/exchange/details/313/");
После выполнения скрипта в переменной $src будет помещён исходный код указанной вэб страницы. Что бы в этом убедиться, достаточно ниже добавить строчку вида:
Показать
Скрыть
echo $src;
Теперь после выполнения сценария вверху появиться скачанная страница. Но вместо страницы нам требуются цены валюты из таблички, и их необходимо каким то образом отфильтровать и поместить в другую переменную.
Для парсинга в php имеется замечательная функция preg_match и preg_match_all. Эти функции ищут по регулярному выражения. Первая функция находит только одно совпадение, вторая находит все. Так как цен на сайте много, используем вторую функция.
Для настройки регулярного выражения требуется немного изучить исходный код исследуемой страницы:
Показать
Скрыть
<h2>Курсы валют обменного пункта</h2><table class="table table-hover table-striped"><thead><tr><th>Валюта<th>Покупка<th>Продажа<th class="nat-bank-rate">НБ РК<tbody><tr><td>USD / Доллар США<td style="text-align:center">376.00<td style="text-align:center">378.50<td class="nat-bank-rate" style="text-align:center">1 USD = 376.4 KZT<tr><td>EUR / Евро<td style="text-align:center">410.00<td style="text-align:center">415.00<td class="nat-bank-rate" style="text-align:center">1 EUR = 409.56 KZT<tr><td>RUB / Российский рубль<td style="text-align:center">5.90<td style="text-align:center">5.98<td class="nat-bank-rate" style="text-align:center">1 RUB = 5.91 KZT<tr><td>GBP / Фунт стерлингов<td style="text-align:center"><td style="text-align:center"><td class="nat-bank-rate" style="text-align:center">1 GBP = 488.19 KZT<tr><td>CNY / Китайский юань<td style="text-align:center">48.00<td style="text-align:center">53.00<td class="nat-bank-rate" st
Из кода видно, что нужные цифры находятся между закрывающейся и открывающейся скобкой (>376.00<), и имеют определённый формат (1,2 или 3 цифры перед точкой, точку и 2 цифры после точки). Согласно этой логике делаем вывод:
- Перед нужной цифрой стоит закрывающаяся скобка >
- Далее идёт от 1 до 3 цифр
- Далее стоит точка
- После точки идут 2 цифры
- Потом идёт открывающаяся скобка <
Согласно этой логике составляем регулярное выражение, которое имеет вид:
/(?<=>)\d{1,3}[.]{1}\d{2}(?=<)/
Ищем совпадения в переменной $src с регулярным выражением и помещаем найденное в массив $col
Команда выглядит так:
preg_match_all("/(?<=>)\d{1,3}[.]{1}\d{2}(?=<)/", $src, $col);
Теперь осталось отфильтровать время обновления. В исходном коде ищем нужную информацию:
name">Обновлен<td> 22 мин. назад<tr><td clas
Но эта строчка так же может содержать иконку с восклицательным знаком:
name">Обновлен<td><span class="glyphicon glyphicon-exclamation-sign"></span> 8 ч. назад<tr><td clas
Поэтому придётся делать два регулярных выражения и искать второй раз, если первый ничего не найдёт.
Регулярные выражения выглядят так:
/(?<=glyphicon-exclamation-sign"><\/span> )(.+?)(?=<tr><td)/
/(?<=Обновлен<td>)(.+?)(?=<tr><td)/
Добавляем к коду строки:
preg_match('/(?<=glyphicon-exclamation-sign"><\/span> )(.+?)(?=<tr><td)/', $src, $time);
if ($time[0]=='') {
preg_match('/(?<=Обновлен<td>)(.+?)(?=<tr><td)/', $src, $time);}
Теперь после выполнения сценария в переменной $col будут находиться все найденные цены, а в переменной $time - время последнего обновления. Что бы это проверить, добавим строчку для вывода этой информации:
echo $col[0][0]."<br>".$col[0][1]."<br>".$col[0][2]."<br>".$col[0][3]."<br>".$col[0][4]."<br>".$col[0][5]."<br>".$col[0][6]."<br>".$col[0][7]."<br>";
echo $time[0];
Ставим птичку "выполнить после сохранения" и жмём кнопку "Сохранить".
Вверху страницы появятся интересующие цифры, ради чего создавался этот сценарий. Осталось поместить эти цифры в свойства объекта.
У себя я создал новый класс "currency", добавил в нём свойства каждой валюты. В этом классе создал объект "ExchangeRates".
Теперь в сценарий добавим ещё несколько строк, которые поместят цены валют в соответствующее свойство созданного объекта:
Показать
Скрыть
if (!$col[0][0]=='') {sg("ExchangeRates.USDpurchase",$col[0][0]);}
if (!$col[0][1]=='') {sg("ExchangeRates.USDsale",$col[0][1]);}
if (!$col[0][2]=='') {sg("ExchangeRates.EURpurchase",$col[0][2]);}
if (!$col[0][3]=='') {sg("ExchangeRates.EURsale",$col[0][3]);}
if (!$col[0][4]=='') {sg("ExchangeRates.RUBpurchase",$col[0][4]);}
if (!$col[0][5]=='') {sg("ExchangeRates.RUBsale",$col[0][5]);}
if (!$col[0][6]=='') {sg("ExchangeRates.CNYpurchase",$col[0][6]);}
if (!$col[0][7]=='') {sg("ExchangeRates.CNYsale",$col[0][7]);}
if (!$time[0]=='') {sg("ExchangeRates.Time",$time[0]);}
Результат выполнения сценария можно увидеть ниже:
Стоимость валюты в течении дня меняется несколько раз, поэтому этот сценарий требуется в запускать с определённой периодичностью. Проще всего и нагляднее это делать в дополнении "Cron". Его легко найти в маркете дополнений.
Заходим в Cron и жмём кнопку "Добавить новую запись". В окне вписываем название, в раздел "Crontab" для выполнениния сценария с периодичностью 30 минут вписываем: */30 * * * *
В поле "Код" вписываем команду запуска нашего сценария:
runScript('ExchangeRates');
Вверху в разделе "Enable" не забываем перевести выключатель в положение "On".
Сохраняем и выходим.
Теперь у нас есть информация по курсам валют, а дальше дело техники, как его отобразить на страницах Majordomo. Можно в виде таблицы, или графиков.
В итоге полный код сценария будет выглядеть так:
Показать
Скрыть
function get_remote_data($url, $post_paramtrs=false, $extra=array('schemeless'=>true, 'replace_src'=>true, 'return_array'=>false, "curl_opts"=>[])) { $c = curl_init(); curl_setopt($c, CURLOPT_URL, $url); curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); //if parameters were passed to this function, then transform into POST method.. (if you need GET request, then simply change the passed URL) if($post_paramtrs){ curl_setopt($c, CURLOPT_POST,TRUE); curl_setopt($c, CURLOPT_POSTFIELDS, (is_array($post_paramtrs)? http_build_query($post_paramtrs) : $post_paramtrs) ); } curl_setopt($c, CURLOPT_SSL_VERIFYHOST,false); curl_setopt($c, CURLOPT_SSL_VERIFYPEER,false); curl_setopt($c, CURLOPT_COOKIE, 'CookieName1=Value;'); $headers[]= "User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:76.0) Gecko/20100101 Firefox/76.0"; $headers[]= "Pragma: "; $headers[]= "Cache-Control: max-age=0"; if (!empty($post_paramtrs) && !is_array($post_paramtrs) && is_object(json_decode($post_paramtrs))){ $headers[]= 'Content-Type: application/json'; $headers[]= 'Content-Length: '.strlen($post_paramtrs); } curl_setopt($c, CURLOPT_HTTPHEADER, $headers); curl_setopt($c, CURLOPT_MAXREDIRS, 10); //if SAFE_MODE or OPEN_BASEDIR is set,then FollowLocation cant be used.. so... $follow_allowed= ( ini_get('open_basedir') || ini_get('safe_mode')) ? false:true; if ($follow_allowed){curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1);} curl_setopt($c, CURLOPT_CONNECTTIMEOUT, 9); curl_setopt($c, CURLOPT_REFERER, $url); curl_setopt($c, CURLOPT_TIMEOUT, 60); curl_setopt($c, CURLOPT_AUTOREFERER, true); curl_setopt($c, CURLOPT_ENCODING, 'gzip,deflate'); curl_setopt($c, CURLOPT_HEADER, !empty($extra['return_array'])); //set extra options if passed if(!empty($extra['curl_opts'])) foreach($extra['curl_opts'] as $key=>$value) curl_setopt($c, constant($key), $value); $data = curl_exec($c); if(!empty($extra['return_array'])) { preg_match("/(.*?)\r\n\r\n((?!HTTP\/\d\.\d).*)/si",$data, $x); preg_match_all('/(.*?): (.*?)\r\n/i', trim('head_line: '.$x[1]), $headers_, PREG_SET_ORDER); foreach($headers_ as $each){ $header[$each[1]] = $each[2]; } $data=trim($x[2]); } $status=curl_getinfo($c); curl_close($c); // if redirected, then get that redirected page if($status['http_code']==301 || $status['http_code']==302) { //if we FOLLOWLOCATION was not allowed, then re-get REDIRECTED URL //p.s. WE dont need "else", because if FOLLOWLOCATION was allowed, then we wouldnt have come to this place, because 301 could already auto-followed by curl :) if (!$follow_allowed){ //if REDIRECT URL is found in HEADER if(empty($redirURL)){if(!empty($status['redirect_url'])){$redirURL=$status['redirect_url'];}} //if REDIRECT URL is found in RESPONSE if(empty($redirURL)){preg_match('/(Location:|URI:)(.*?)(\r|\n)/si', $data, $m); if (!empty($m[2])){ $redirURL=$m[2]; } } //if REDIRECT URL is found in OUTPUT if(empty($redirURL)){preg_match('/moved\s\<a(.*?)href\=\"(.*?)\"(.*?)here\<\/a\>/si',$data,$m); if (!empty($m[1])){ $redirURL=$m[1]; } } //if URL found, then re-use this function again, for the found url if(!empty($redirURL)){$t=debug_backtrace(); return call_user_func( $t[0]["function"], trim($redirURL), $post_paramtrs);} } } // if not redirected,and nor "status 200" page, then error.. elseif ( $status['http_code'] != 200 ) { $data = "ERRORCODE22 with $url<br/><br/>Last status codes:".json_encode($status)."<br/><br/>Last data got:$data";} //URLS correction if(function_exists('url_corrections_for_content_HELPER')){ $data= url_corrections_for_content_HELPER($data, $status['url'], array('schemeless'=>!empty($extra['schemeless']), 'replace_src'=>!empty($extra['replace_src']), 'rawgit_replace'=>!empty($extra['rawgit_replace']) ) ); } $answer = ( !empty($extra['return_array']) ? array('data'=>$data, 'header'=>$header, 'info'=>$status) : $data); return $answer; } function url_corrections_for_content_HELPER( $content=false, $url=false, $extra_opts=array('schemeless'=>false, 'replace_src'=>false, 'rawgit_replace'=>false) ) { $GLOBALS['rdgr']['schemeless'] =$extra_opts['schemeless']; $GLOBALS['rdgr']['replace_src']=$extra_opts['replace_src']; $GLOBALS['rdgr']['rawgit_replace']=$extra_opts['rawgit_replace']; if($GLOBALS['rdgr']['schemeless'] || $GLOBALS['rdgr']['replace_src'] ) { if($url) { $GLOBALS['rdgr']['parsed_url'] = parse_url($url); $GLOBALS['rdgr']['urlparts']['domain_X']= $GLOBALS['rdgr']['parsed_url']['scheme'].'://'.$GLOBALS['rdgr']['parsed_url']['host']; $GLOBALS['rdgr']['urlparts']['path_X'] = stripslashes(dirname($GLOBALS['rdgr']['parsed_url']['path']).'/'); $GLOBALS['rdgr']['all_protocols']= array('adc','afp','amqp','bacnet','bittorrent','bootp','camel','dict','dns','dsnp','dhcp','ed2k','empp','finger','ftp','gnutella','gopher','http','https','imap','irc','isup','javascript','ldap','mime','msnp','map','modbus','mosh','mqtt','nntp','ntp','ntcip','openadr','pop3','radius','rdp','rlogin','rsync','rtp','rtsp','ssh','sisnapi','sip','smtp','snmp','soap','smb','ssdp','stun','tup','telnet','tcap','tftp','upnp','webdav','xmpp'); } $GLOBALS['rdgr']['ext_array'] = array( 'src' => array('audio','embed','iframe','img','input','script','source','track','video'), 'srcset'=> array('source'), 'data' => array('object'), 'href' => array('link','area','a'), 'action'=> array('form') //'param', 'applet' and 'base' tags are exclusion, because of a bit complex structure ); $content= preg_replace_callback( '/<(((?!<).)*?)>/si', //avoids unclosed & closing tags function($matches_A){ $content_A = $matches_A[0]; $tagname = preg_match('/((.*?)(\s|$))/si', $matches_A[1], $n) ? $n[2] : ""; foreach($GLOBALS['rdgr']['ext_array'] as $key=>$value){ if(in_array($tagname,$value)){ preg_match('/ '.$key.'=(\'|\")/i', $content_A, $n); if(!empty($n[1])){ $GLOBALS['rdgr']['aphostrope_type']= $n[1]; $content_A = preg_replace_callback( '/( '.$key.'='.$GLOBALS['rdgr']['aphostrope_type'].')(.*?)('.$GLOBALS['rdgr']['aphostrope_type'].')/i', function($matches_B){ $full_link = $matches_B[2]; //correction to files/urls if(!empty($GLOBALS['rdgr']['replace_src']) ){ //if not schemeless url if(substr($full_link, 0,2) != '//'){ $replace_src_allow=true; //check if the link is a type of any special protocol foreach($GLOBALS['rdgr']['all_protocols'] as $each_protocol){ //if protocol found - dont continue if(substr($full_link, 0, strlen($each_protocol)+1) == $each_protocol.':'){ $replace_src_allow=false; break; } } if($replace_src_allow){ $full_link = $GLOBALS['rdgr']['urlparts']['domain_X']. (str_replace('//','/', $GLOBALS['rdgr']['urlparts']['path_X'].$full_link) ); } } } //replace http(s) with sheme-less urls if(!empty($GLOBALS['rdgr']['schemeless'])){ $full_link=str_replace( array('https://','http://'), '//', $full_link); } //replace github mime if(!empty($GLOBALS['rdgr']['rawgit_replace'])){ $full_link= str_replace('//raw.github'.'usercontent.com/','//rawgit.com/', $full_link); } $matches_B[2]=$full_link; unset($matches_B[0]); $content_B=''; foreach ($matches_B as $each){$content_B .= $each; } return $content_B; }, $content_A ); } } } return $content_A; }, $content ); $content= preg_replace_callback( '/style="(.*?)background(\-image|)(.*?|)\:(.*?|)url\((\'|\"|)(.*?)(\'|\"|)\)/i', function($matches_A){ $url = $matches_A[7]; $url = (substr($url,0,2)=='//' || substr($url,0,7)=='http://' || substr($url,0,8)=='https://' ? $url : '#'); return 'style="'.$matches_A[1].'background'.$matches_A[2].$matches_A[3].':'.$matches_A[4].'url('.$url.')'; //$matches_A[5] is url taged ,7 is url }, $content ); } return $content;} $src=get_remote_data("https://pomenyay.kz/exchange/details/313/"); preg_match_all("/(?<=>)\d{1,3}[.]{1}\d{2}(?=<)/", $src, $col); echo $col[0][0]."<br>".$col[0][1]."<br>".$col[0][2]."<br>".$col[0][3]."<br>".$col[0][4]."<br>".$col[0][5]."<br>".$col[0][6]."<br>".$col[0][7]."<br>"; preg_match('/(?<=glyphicon-exclamation-sign"><\/span> )(.+?)(?=<tr><td)/', $src, $time); if ($time[0]=='') { preg_match('/(?<=Обновлен<td>)(.+?)(?=<tr><td)/', $src, $time);} echo $time[0]; if (!$col[0][0]=='') {sg("ExchangeRates.USDpurchase",$col[0][0]);} if (!$col[0][1]=='') {sg("ExchangeRates.USDsale",$col[0][1]);} if (!$col[0][2]=='') {sg("ExchangeRates.EURpurchase",$col[0][2]);} if (!$col[0][3]=='') {sg("ExchangeRates.EURsale",$col[0][3]);} if (!$col[0][4]=='') {sg("ExchangeRates.RUBpurchase",$col[0][4]);} if (!$col[0][5]=='') {sg("ExchangeRates.RUBsale",$col[0][5]);} if (!$col[0][6]=='') {sg("ExchangeRates.CNYpurchase",$col[0][6]);} if (!$col[0][7]=='') {sg("ExchangeRates.CNYsale",$col[0][7]);} if (!$time[0]=='') {sg("ExchangeRates.Time",$time[0]);}