人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

HTML中のhrefの値を一括変換するコードを探しています。

例えば、以下のHTMLを http://input.example.com/menu/ から取得したと仮定して、

<a href="sitemap.html">サイトマップ</a> <!--相対パス-->
<a href="../index.html">トップ</a> <!--相対パス-->
<a href="/help.html">ヘルプ</a> <!--絶対パス-->
<a href="http://www.google.co.jp/">Google</a> <!--外部リンク-->

以下のように変換することができるコードです。

<a href="http://contentproxy.example.com/mobile/http://input.example.com/menu/sitemap.html">
<a href="http://contentproxy.example.com/mobile/http://input.example.com/index.html">
<a href="http://contentproxy.example.com/mobile/http://input.example.com/help.html">
<a href="http://contentproxy.example.com/mobile/http://www.google.co.jp">

コードは Perl, Ruby, PHP, JavaScript のいずれかでお願いします。
ライブラリでも結構です。

●質問者: akiyan
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:Google href HTML JavaScript Perl
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ●
●60ポイント

ためしにPHPで書いてみました。

(ご要望とずれていたら申し訳ありません。)

取り込むHTMLファイルはsample.htmlとしています。

適当な名前のPHPファイルにして、sample.htmlと同じディレクトリに保存して実行してみてください。

<?php
// HTMLファイルの読み込み
$lines = file('./sample.html');
// カレントディレクトリのパスを取得
//$dirname = "http://input.example.com/menu/";
$dirname = realpath('.');
// ホスト名の取得
preg_match("/^(http:\/\/)?([^\/]+)/i",$dirname,$matches);
$host = $matches[2];
// ドメイン名の取得
preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);
$domain = $matches[0];
// 置換処理
for ($i=0;$i<count($lines);$i++){
// 相対パスの場合の処理
if (preg_match('/<!--相対パス-->/',$lines[$i])){
$lines[$i] = preg_replace('/<a href="/',"<a href=\"http://contentproxy." . $domain . '/mobile/' . $dirname, $lines[$i]);
$lines[$i] = preg_replace('/<\/a>.*<!.*>/','</a>',$lines[$i]);
print $lines[$i];
// 絶対パスの場合の処理
} else if (preg_match('/<!--絶対パス-->/',$lines[$i])){
$lines[$i] = preg_replace('/<a href="/',"<a href=\"http://contentproxy." . $domain . '/mobile/http://' . $host, $lines[$i]);
$lines[$i] = preg_replace('/<\/a>.*<!.*>/','</a>',$lines[$i]);
print $lines[$i];
// 外部リンクの場合の処理
} else if (preg_match('/<!--外部リンク-->/',$lines[$i])){
$lines[$i] = preg_replace('/<a href="/',"<a href=\"http://contentproxy." . $domain . '/mobile/', $lines[$i]);
$lines[$i] = preg_replace('/<\/a>.*<!.*>/','</a>',$lines[$i]);
print $lines[$i];
} else {
print $lines[$i];
}
}
?>

ベタ書きしている部分(http://contentproxy)は変数にした方がソースが短くなって良いかもしれないです。

また、2番目の例のような行を置換した場合、

<a href="http://contentproxy.example.com/mobile/http://input.example.com/index.html">

ではなく

<a href="http://contentproxy.example.com/mobile/http://input.example.com/menu/../index.html">

のようになりますが、たいていのブラウザでは適切に解釈されるので問題ないはずです。

一度確認してみてください。

参考になると幸いです。

◎質問者からの返答

>たいていのブラウザでは適切に解釈される

なるほど!たしかにそうですね。

参考になりました。ありがとうございました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ