Simplexml патч для allow_url_fopen, который будет использоваться на simplehtmldom - PullRequest
1 голос
/ 05 мая 2011

Моя хостинговая компания отключила allow_url_fopen & allow_url_include. Они рекомендуют вместо этого использовать cURL, тогда я увидел этот патч на simplexml

$calendar = simplexml_load_file($source); with
if (ini_get('allow_url_fopen')) {
$calendar =       simplexml_load_file($source); 
}   
else {    
$ch = curl_init($source);    
curl_setopt  ($ch, CURLOPT_HEADER, false); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    
$xml_raw = curl_exec($ch);    
$calendar = simplexml_load_string($xml_raw);  }

и он работает на моем хостинге, поэтому мне было интересно, смогу ли я использовать его на simplehtmldom. Вот код, который я использую

<?php
include('simple_html_dom.php');
include ('phpQuery.php');   
// Create DOM from URL
$html = file_get_html('http://www.urlhere.com/');
   ?>

Могу ли я использовать это? Если да, какие изменения я должен внести, спасибо за вашу помощь

Отредактированный выше код

<?php
include('simple_html_dom.php'); 
include ('phpQuery.php'); 

if (ini_get('allow_url_fopen')) {       
$html = file_get_html('http://www.weather.bm/'); }
else{       $ch = curl_init('http://www.weather.bm/');           
curl_setopt  ($ch, CURLOPT_HEADER, false);        
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);           
$src = curl_exec($ch);           
$html = str_get_html($src, false); 
var_dump($html);  }   

?>

<div id="leftwrapper">
<div id="CurrentConditions">
<h2>Current Conditions</h2>

<div id="current-content">
<div id="elementleft">
<?php
foreach($html->find('div.obElementLeft') as $e)
echo $e->outertext;
?>
</div>
<div id="elementright"><?php 
foreach($html->find('div.obElementRight') as $e)
echo $e->outertext; 
?>
</div></div></div>
<div id="rightwrapper"> 
<div id="TodayForecast">
<h2>24-Hour Forecast</h2>
<?php 
foreach($html->find('.TodaysForecastContainer') as $e)
$doc = phpQuery::newDocumentHTML( $e );  
$containers = pq('.TodaysForecastContainerInner', $doc); 
foreach( $containers as $container ) {     
$div = pq('div', $container);      
$div->eq(1)->removeAttr('style')->addClass('thumbnail')->
html( pq( 'img', $div->eq(1))->removeAttr('height')->
removeAttr('width')->removeAttr('alt') ); 
$div->eq(0)->removeAttr('style')->addClass('day')-> 
html( pq( 'u', $div->eq(0) )->html() );           
$div->eq(2)->removeAttr('style')->addClass('description');   }  
print $doc; 
?>

</div><!--end of todayforecast--> 
<div id="bws-foot">Weather data provided in part by the Bermuda Weather
Service</div>     <img id="bws-logo" src="images/bwslogo.jpg" />
<div id="hilo">
<p>Today's Temperature:</p>
<?php
foreach($html->find('div.HiLoContainer') as $e)
$doc = phpQuery::newDocumentHTML( $e );  
$containers = pq('div.HiLoContainer', $doc); 
foreach( $containers as $container ) {     $div = pq('div', $container);        
$div->eq(0)->removeAttr('style')->addClass('hi1');  
$div->eq(1)->removeAttr('style')->addClass('lo1'); 
}  print $doc; 
?>

Прогноз

найти ('. SynopsisContainer span') как $ e) echo $ e-> innertext. '
'; ?>

Прогноз погоды на 4 дня

foreach ($ html-> find ('. FourDayForecastContainer') как $ e)

$ doc = phpQuery :: newDocumentHTML ($ e);
$ container = pq ('.FourDayForecastContainerInner', $ doc); foreach ($ Containers как $ container) {$ div = pq ('span', $ container);
$ img = pq ('img', $ container);
$ Div-> эк (0) -> removeAttr ( 'стиль') -> addClass ( 'день') -> html (pq ('u', $ div-> eq (0)) -> html ());

$ img-> эк (0) -> removeAttr ( 'стиль') -> removeAttr ( 'высота') -> removeAttr ( 'ширина') -> removeAttr ( 'альт') -> addClass ( 'эскиз') -> html (pq ('img', $ img-> eq (0))); $ imghtml = pq ('a', $ container) -> HTML (); рд ($ контейнер) -> перед именем ($ imghtml); pq ('a', $ container) -> remove ();
$ Div-> экв (1) -> removeAttr ( 'стиль') -> addClass ( 'привет');
$ Div-> эк (3) -> removeAttr ( 'стиль') -> addClass ( 'вот'); $ Div-> экв (5) -> removeAttr ( 'стиль') -> addClass ( 'описание'); } печатать $ doc; ?>

Ответы [ 2 ]

3 голосов
/ 05 мая 2011

Вам нужно отредактировать источник simple_html_dom. Легче просто создать свою собственную функцию, которая делает то, что делает оригинал. Оригинал (который вы не можете использовать из-за allow_url_fopen):

function file_get_html() {
    $dom = new simple_html_dom;
    $args = func_get_args();
    @$dom->load(call_user_func_array('file_get_contents', $args), true);
    if (($error=error_get_last())!==null)
    throw new Exception($error['message']);
    return $dom;
}

Вы можете просто сделать это:

if (ini_get('allow_url_fopen')) {
      $html = file_get_html('http://www.urlhere.com/');
}else{
      $ch = curl_init('http://www.urlhere.com/');    
      curl_setopt  ($ch, CURLOPT_HEADER, false); 
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    
      $src = curl_exec($ch);    
      $html = str_get_html($src, false);
}

Нет необходимости изменять источник, и фактически делает то же самое.

1 голос
/ 05 мая 2011

Другой вариант - использовать потоковую обертку data://, которая позволит вам использовать функцию file_get_html() без ее изменения.

if (!ini_get('allow_url_fopen')) {
    $ch = curl_init($source);    
    curl_setopt($ch, CURLOPT_HEADER, false); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    
    $xml_raw = curl_exec($ch); 
    curl_close($ch);   
    $source  = 'data://text/html;base64,'.base64_encode($xml_raw);
}
$html = file_get_html($source);

В этом подходе используется схема URL данных RFC 2397 , которая поддерживается в PHP 5.2.0 и более поздних версиях.

...