allow_url_fopen的simplexml补丁用于simplehtmldom

时间:2011-05-05 14:34:32

标签: php simplexml

我的托管公司已禁用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; 
?>

   

   find('。SynopsisContainer span')为$ e)    echo $ e-&gt; innertext。 '
';    ?&GT;

   

   

4天天气预报

foreach($ html-&gt; find('。FourDayForecastContainer')as $ e)

$ doc = phpQuery :: newDocumentHTML($ e);
   $ containers = pq('.FourDayForecastContainerInner',$ doc);    foreach($ containers为$ container){$ div = pq('span',$ container);
   $ img = pq('img',$ container);
   $ div-&GT;当量(0) - &GT; removeAttr( '风格') - &GT; addClass( '天') - &GT;    html(pq('u',$ div-&gt; eq(0)) - &gt; html());

$ img-&GT;当量(0) - &GT; removeAttr( '风格') - &GT; removeAttr( '高度') - &GT;    removeAttr( '宽度') - &GT; removeAttr( 'ALT') - &GT; addClass( '缩略图') - &GT;    html(pq('img',$ img-&gt; eq(0))); $ imghtml = pq('a',$ container) - &gt;    HTML(); PQ($容器) - &GT;前置($ imghtml); pq('a',$ container) - &gt; remove();
   $ div-&GT;当量(1) - &GT; removeAttr( '风格') - &GT; addClass( '喜');
   $ div-&GT;当量(3) - &GT; removeAttr( '风格') - &GT; addClass( 'LO');    $ div-&GT;当量(5) - &GT; removeAttr( '风格') - &GT; addClass( '描述');打印$ doc;    ?&GT;

2 个答案:

答案 0 :(得分:3)

您需要编辑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 :(得分:1)

另一种选择是使用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);

此方法使用PHP 5.2.0及更高版本支持的RFC 2397数据URL方案。