HTML文書内の相対URLを絶対URLに変換する方法

このQ&Aのポイント
  • 相対URLを絶対URLに変換する方法について教えてください
  • PHPを使って擬似的なプロクシサーバーを作成している際に、相対URLでリンクされている画像やリンク先に遷移できない問題が発生しています。リンクをすべて絶対URLに置き換える方法を知りたいです。
  • 現在の処理では上手く絶対URLに置き換えられない例があります。具体的な処理内容や使用している関数について教えてください。
回答を見る
  • ベストアンサー

HTML文書内の相対URLを絶対URLに変換する方法

現在,PHPを使って擬似的なプロクシサーバーを作成しています. 動作としては,フォームにURLを入力し,送信,受け取ったPHP側でfile_get_contentsでHTMLデータを受信し,それを出力する物です. ところが,当然ではありますが相対URLでリンクされていると,その画像やリンク先に遷移することができません. そこで,リンクをすべて絶対URLに置き換えたいのですが,現在では上手く置き換わりません.(置き換わらない例:https://ssl.kakaku.com/auth/id/login.asp の画像の一部など) どなたかご教授いただけると幸いです. よろしくお願いします. なお,現在の処理は以下のようになっています. 使用関数 HTMLSQL,make_url(下記URLにあるgetAbsURL関数) http://www.jonasjohn.de/lab/htmlsql.htm http://www.phppro.jp/qa/2290 --------------------------------------------------------- // HTMLSQLオブジェクトの生成 $htmlsqlObj = new htmlsql(); // 相対URLのリンクを絶対URLへ変換 if(!$htmlsqlObj->connect("string",$html_data)) { error("エラー",__LINE__); } // 絶対URL化ターゲットタグ $target_tags = array("a"=>"href","link"=>"href","img"=>"src","form"=>"action","script"=>"src","input"=>"src"); $i =0; while(list($key,$val) = each($target_tags)) { if(!$htmlsqlObj->query("SELECT {$val} FROM {$key}")) { error("エラー",__LINE__); } $link_array[$i] = $htmlsqlObj->fetch_array(); $i++; } // 絶対URL変換 for($i = 0;$i < count($link_array);$i++) { for($j = 0;$j < count($link_array[$i]);$j++) { while(list($key,$val) = each($link_array[$i][$j])) { // 相対パス以外を排除 if(!preg_match("/(http:\/\/)|(ftp:\/\/)|(mailto:)|#/",$val) && $val != "/" && $val != "") { // 絶対URL化 $full_url = make_url($url,$val); $val_new = preg_quote($val,"/"); $html_data = preg_replace("/{$val_new}/",$full_url,$html_data); } } } }

  • PHP
  • 回答数3
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

preg_matchに、「https://」を条件入れ忘れてるのが原因だと思います。 ちなみに、 http://simplehtmldom.sourceforge.net/ このようなものもありますので、今回の要件であればこちらのほうが使いやすいのではないでしょうか。 htmlSQLがHTMLをSQLのように取得できるのに対して、こちらはjQueryのように取得することが出来、検索した条件に値を挿入してその結果を返すことが出来るため、今回のようなpreg_replaceで書き換える手間が減るかと思います。

gottyato
質問者

お礼

おお.このような物があったのですね.試してみます. 結局のところ,すでに置き換えた属性:値の組み合わせを配列化し,置き換えの組み合わせを複数回行わないようにしたことでとりあえず解決しました.(ただ,これだとバグが残るので,根本的な解決にはなっていないのですがw) preg_matchにhttpsが抜けていたのはただのミスでしたね. いろいろと情報ありがとうございました. とりあえず,頂いたURLのライブラリを試してみます.

その他の回答 (2)

回答No.2

表示できてない場合の、取得して変換した後のHTMLソースはどのようになっているのでしょうか。 変換自体がされていないのであれば、preg_matchのところで条件漏れがあるのでしょうから、一度、$valに直接その文字を入れてみて、マッチするまで繰り返してみるとか。 後は、htmlSQLが漏れを発生させている場合もあるのでそちらも確認したほうが良いかと思います。特にSJISとか文字コードで上手いこと行かない場合があります。(英語圏のライブラリとかだと結構ある) 余談ですが、<base url="">といったタグで、HTML中の相対パスのベースパスを明示的に決めることが出来るのですがコレを考慮していないと上手く表示されません。(今回の価格.comでは使ってませんでしたが。)

gottyato
質問者

お礼

https://ssl.kakaku.com<あと11回繰り返し>/images/cell.gif 補足では途中で切れてしまいましたが,https://ssl.kakaku.comという文字列が12回続いた後,/image/cell.gifがくっついています.

gottyato
質問者

補足

価格サイト内「価格.com IDまたはパスワードを忘れた場合はこちらへ」のすぐ左にあるアイコンのURLが /images/arrow_home.gif ↓ https://ssl.kakaku.comhttps://ssl.kakaku.comhttps://ssl.kakaku.comhttps://ssl.kakaku.comhttps://ssl.kakaku.comhttps://ssl.kakaku.comhttps://ssl.kakaku.comhttps://ssl.kakaku.comhttps://ssl.kakaku.comhttps://ssl.kakaku.comhttps://ssl.kakaku.comhttps://ssl.kakaku.com/images/cell.gif と置き換わってしまっています. ループの部分で何度もマッチしてしまっているというのは分かるのですが,どのように解決すればいいのかがよく分かりません. よろしくお願いします. (baseタグを忘れていました.htmlSQLの条件に追加します.)

  • oraora777
  • ベストアンサー率20% (56/268)
回答No.1

ソース適当にしか読んでないけど これ、別ファイルになっているスタイルシートの扱いはどなっている?

gottyato
質問者

補足

相対パスで描かれている外部CSSなどもmake_urlで絶対URL化しています.

関連するQ&A

  • これは相対URLなんですか?

    HTMLを少しかじっている者です。 仕事の関係で、とあるサイトのデータをローカル上に落として、ローカル上で動くようにしているのですが・・・・ サイトのソースを見た所、画像のファイル名のURLの書き方が以下のようになっています。 <img src="/image/gazou.gif"> 私は以下のような書き方しか知らないのですが、 <img src="gazou.gif"> <img src="image/gazou.gif"> <img src="../image/gazou.gif"> <img src="/image/gazou.gif">この書き方も相対パスの書き方なんですか? 本当に、少しだけHTMLをかじっているだけなので、もしかしたら基本的な事なのかも知れませんが、みなさまどうか、教えてください。

    • ベストアンサー
    • HTML
  • Word内の絶対パス<-相対パスを簡単にする方法はありますか?

    Word内の絶対パス<-相対パスを簡単にする方法はありますか? Wordファイル(文書内のリンクとしてブックマークがあります)を受け取って、PDFに変換したのですが、リンクが開けないのでおかしいなと思ってWordのファイルを確認すると、リンクが絶対パスになっていました。  これを一発で相対パスにする方法はないでしょうか。 どうしてもということになると、手打ちで絶対パスの部分を消していくしかないでしょうか。たぶんないのだろうと思いますが、それをやる決意をするにも、「そんな方法ない」と背中を押してもらえないかと思い質問しました。  個人的には、およそリンクを設定するには外部のURLでもない限り相対パスにしていますが、あえて絶対パスにしておく人は何かメリットがあってやっているのでしょうか?たとえば、汎用性(と言えばいいのでしょうか)を低くすることでセキュリティーの効果を持たせようとか、そういうことなのでしょうか。 よろしくおねがいします。

  • 相対パスを絶対パスに。

    Web巡回ロボットのようなモノを作ろうと思っています。 あるURLにアクセスし、そのソースからリンクされているURLを拾って・・・・を繰り返します。 そこで、相対パスを絶対パスに簡単に変換する方法はありますか? ご教授お願いします。

    • ベストアンサー
    • Java
  • 絶対パス 相対パス SSL https

    無知な者ですので質問も稚拙かもわかりませんが よろしくお願いいたします。 現在、WEBサイトを制作する際に SSLで暗号化されたページにリンクする場合、 相対パスでリンクするとURLが「https://~」ではなく 「http://~」となってしまう為、 「https://~」と絶対パスでリンクしています。 これを相対パスでリンクさせる方法がありますでしょうか? もしございましたら、お手数ですがお教え願えますでしょうか? よろしくお願いいたします。

  • URLの相対指定について

    いま、BASEタグを使ってURLを相対指定して、簡略化をしているHTML文書があります。 このHTML内で、もう一つ別の相対指定の基準を指定する方法はあるのでしょうか? リンクの位置関係は簡単に書くと下のようになってます。 Web Site +-HTML文書 +-リンク先のファイル(複数) Local +-リンク先のファイル(多数) Localのリンク先のファイルが多数あるので、 いちいち<A href="file:///.....と書くのがいやなので、 BASEタグによる基準をLocalのフォルダにしています。 しかし、こうするとWeb Site上へのリンクはいちいち、 <A href="http://.....と絶対指定しなければなりません。 これを回避したいのです。

  • 相対URLによるリダイレクト

    Locationヘッダに転送先のURLを指定する際に、相対URLをフルパスで指定すると内部リダイレクトになりますが、絶対URLを指定せずにブラウザにリダイレクトさせる方法はないでしょうか。 具体的にはこうです。 URL http://www.xxx.com/dir/from.cgi という位置にスクリプトがあるとして、ドキュメントルートにある「to.html」にリダイレクトさせたい場合、 Location: http://www.xxx.com/to.html と出力するのではなく、 Location: /to.html と出力すると、内部リダイレクトによってブラウザに返されることなく、つまりブラウザの「アドレス」欄はhttp://www.xxx.com/dir/from.cgiのまま「to.html」の内容が表示されるわけですが、そうではなく前者のように動作させたいのです(ブラウザに返してリダイレクトさせたい)。 目的は、ドメインなど絶対URLが変更になっても汎用的にスクリプトを移行できるようにしたい(絶対URLを書かなくて良いようにしたい)のですが、内部リダイレクトでは表示されるHTMLの内容によって、たとえば<img src="./image.gif">など相対パス指定の参照が正しく表示されないためです。 どうぞよろしくお願いいたします。

    • 締切済み
    • CGI
  • 条件をつけて表として書き出すには

    何度もすみません。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2331409 の延長です。 データやリンク先を書き込んでいるb.js、c.jsは下記のようにして、表として書き出すものの条件を、例えば、データの15~25の間だけ表に書き出す…というようにさせたいと考えています。 例) b.js↓ var data = new Array() data[50] = "aaaaa" data[49] = "bbbbb"  ↓ data[0] = "xxxxx" c.js↓ var link = new Array() link[50] = "049.html" link[49] = "048.html"  ↓ link[0] = "001.html" 表を書き出すa.jsは教わったとおり、↓のように書き込んでいます。 for(i=data.length-1;i>=0;i--){ str_html = str_html + '<tr><td><a href=' + link[i] + '>' + data[i] + '</td>'; --i; if(i==-1){ str_html = str_html + '<td></td></tr>'; }else{ str_html = str_html + '<td><a href=' + link[i] + '>' + data[i] + '</td></tr>'; } } 最小限の改造でできる方法はないでしょうか。 よろしくお願いします。

  • URLの相対パスについて

    はじめまして、疑問に思ったことがあるので質問させて下さい。 参考:http://look2.info/sampl2/ 上記URLのような掲示板の作成を考えているのですがこの掲示板の仕様は特殊なようで、 参考2:http://look2.info/r.php/sampl2/57/ のように実際には存在しないフォルダをr.phpでURLを分解して表示しています。 そして参考2のソースを表示すると ハートの画像部分が <img src="/_gif_/63890.gif" border=0> と指定されていてこの画像の絶対パスは http://look2.info/_gif_/63890.gif になります ここで疑問が出てきたのですが、ソースを見る限りでは「BASE HREF」の指定も無いのに、IMG SRCでは相対パスで書かれています。 このURLの場合通常だと、「../../../_gif_/63890.gif」と指定しないとブラウザでは認識しない筈なのですがプログラムで上記のようなことは出来るのでしょうか?? 詳しい方がいればご教授お願いいたしますm(_ _)m

    • ベストアンサー
    • PHP
  • HTMLからURL部分を取り出したい。

    HTMLからTABLE情報をもとにURLを取り出したいのですが。 <TABLE> <TR> <TD><SMALL><B><A href="http://23336.html">11111</A></B></SMALL></TD></TR> <TR> <TD><SMALL><B><A href="http://23632.html">22222</A></B></SMALL></TD></TR> <TR> <TD><SMALL><B><A href="http://22152.html">33333<A></B></SMALL></TD></TR> </TABLE> のような書式から URL 部分を取り出したいのですが、うまくいきません。 Table = IE.document.all.tags("TABLE") for i = 0 to table.rows.length - 1  for j = 0 to table.rows.item(i).cells.length - 1    url = table.rows.item(i).cells.item(j).childNodes.item(0).href  next j next i .href ---> .innertext にすれば文字情報は取り出せます。 <SMALL> や <B> が入っていなければurlが正常に取り出せます。 よろしくお願い致します。

    • ベストアンサー
    • HTML
  • preg_matrchとpreg_replace

    $settings['link_url3'] = preg_replace("/\//","\\\/",$settings['site_url3']); $url = "http://www.google.co.jp/"; $remote = @fopen($url, "r") or myerror("remote URLをオープンできません"); while ($html = fread($remote,1024)) { if (preg_match("/${settings['link_url3']}/i",$html)) {$found=$found + 1; break;} } という文があったのですが、preg_replaceとpreg_matchのところがいまいちよく解りません。 (preg_replaceとpreg_matchの中の /i とか /\// とか \\\/ の部分が・・・。)

    • ベストアンサー
    • PHP

専門家に質問してみよう