2017-01-24 7 views
3

リモートページを取得し、いくつかの要素を修正し(PHP Simple HTML DOM Parser 'ライブラリを使用)、変更されたコンテンツを出力する必要があります。PHP - リモートページのコンテンツを完全に表示する

ソースに完全なURLがないリモートページに問題があるため、CSS要素と画像が読み込まれません。確かに、要素を変更することから私を止めるわけではありませんが、出力は悪く見えます。あなたは、コード

$html = file_get_html('http://www.raspberrypi.org/downloads'); 
echo $html; 

を使用する場合

例えば、オープンhttps://www.raspberrypi.org/downloads/

しかし、それは悪いなります。私は簡単なハックを適用しようとしましたが、それはほんの少しのに役立ちます:

$html = file_get_html('http://www.raspberrypi.org/downloads'); 
$html=str_ireplace("</head>", "<base href='http://www.raspberrypi.org'></head>", $html); 
echo $html; 

は「http://www.raspberrypi.org」から$ htmlの変数からすべてのリンクを解析するスクリプトを「指示」する方法はありますか?言い換えれば、raspberrypi.orgを取得したすべての画像/ CSS要素の「主な」ソースにする方法は?

私はそれをよりうまく説明する方法を知らないが、あなたは考えがあると信じています。

答えて

0

のみニコライGanovskiソリューションを提供しているので、私は不完全なCSSを探すことにより、フルに部分的なページを変換するコードを書きました/ img/formタグを作成してフルにします。場合、誰かが次のコードを見つけ、それを必要とする:

//finalizes remote page by completing incomplete css/img/form URLs (path/file.css becomes http://somedomain.com/path/file.css, etc.) 
function finalize_remote_page($content, $root_url) 
{ 
$root_url_without_scheme=preg_replace('/(?:https?:\/\/)?(?:www\.)?(.*)\/?$/i', '$1', $root_url); //ignore schemes, in case URL provided by user was http://domain.com while URL in source is https://domain.com (or vice-versa) 

$content_object=str_get_html($content); 
if (is_object($content_object)) 
    { 
    foreach ($content_object->find('link.[rel=stylesheet]') as $entry) //find css 
     { 
     if (substr($entry->href, 0, 2)!="//" && stristr($entry->href, $root_url_without_scheme)===FALSE) //ignore "invalid" URLs like //domain.com 
      { 
      $entry->href=$root_url.$entry->href; 
      } 
     } 

    foreach ($content_object->find('img') as $entry) //find img 
     { 
     if (substr($entry->src, 0, 2)!="//" && stristr($entry->src, $root_url_without_scheme)===FALSE) //ignore "invalid" URLs like //domain.com 
      { 
      $entry->src=$root_url.$entry->src; 
      } 
     } 

    foreach ($content_object->find('form') as $entry) //find form 
     { 
     if (substr($entry->action, 0, 2)!="//" && stristr($entry->action, $root_url_without_scheme)===FALSE) //ignore "invalid" URLs like //domain.com 
      { 
      $entry->action=$root_url.$entry->action; 
      } 
     } 
    } 

return $content_object; 
} 
1

私は地元でこれを試してみましたが、私はHTMLでのリンクタグは、このようなものです(ソースコードに)気づいた:

<link rel='stylesheet' href='/wp-content/themes/mind-control/js/qtip/jquery.qtip.min.css' /> 

は、それは明らかであるべきファイルを必要とし、私のローカルディレクトリ(localhost/wp-content/etc ... /など)。リンクタグの hrefが

<link rel='stylesheet' href='https://www.raspberrypi.org/wp-content/themes/mind-control/js/qtip/jquery.qtip.min.css' /> 

のようなものでなければならないので、何あなたはおそらくやりたいことは、すべてのリンクタグを見つけ、残りの前で彼らのhref属性「https://www.raspberrypi.org/」に追加することです。

EDIT:ねえ、私は実際にスタイルの作品を作ってきた、このコードを試してみてください。

$html = file_get_html('http://www.raspberrypi.org/downloads'); 
$i = 0; 
foreach($html->find('link') as $element) 
{ 
     $html->find('link', $i)->href = 'http://www.raspberrypi.org'.$element->href; 
     $i++; 
} 
echo $html;die; 
+0

はい、それは(いくつかの余分なコーディングが必要になる)作業溶液のように見える - 、リモートドメインのそれの内部が含まれていないすべての「無効」のリンクを見つけますドメインを追加してコンテンツを出力する –

+0

あなたの努力に感謝します。もちろん、コードを少し修正する必要があります(コードは多くの異なるページを解析するために使用されるため、ドメインURLのないリンクにプレフィックスを追加する必要があります)が、簡単なアイデア):) –

+0

はい、hrefにドメインが含まれているかどうかを確認できます。画像については、body要素を繰り返し処理し、要素全体の文字列値に画像拡張子( '.gif'、 '.png'など)が含まれているかどうかを確認することをお勧めします。次に、現在の要素の画像urlまたはsrcを編集することができます。 –

関連する問題