綾小路龍之介の素人思考

[perl] url、uriの相対指定を絶対指定に変換、余分な../../を削除

perlでhtmlをパースする際に、hrefが相対指定されている場合がある。これを絶対指定に変えるためにはuriオブジェクトを作る際にnewではなくnew_absを使う。これをすることで過剰な../を削除してくれる。

つまり以下のようにする。uriオブジェクトを作る際にnewではなくnew_absを使う。

my $base = 'http://exampe.com/hoge/fuga/';
my $href = '../rss'
my $uri = URI->new_abs($href, $base);
print $uri;

1行で確かめる。確かに絶対指定に換わっていることがわかる。

$ perl -MURI -le '$base="http://exampe.com/hoge/fuga/"; $href="../rss"; $uri=URI->new_abs($href,$base); print $uri;'
http://exampe.com/hoge/rss

もっとややこしい例

$ perl -MURI -le '$base="http://exampe.com/hoge/./fuga/../"; $href="./a/n/../rss"; $uri=URI->new_abs($href,$base); print $uri;'
http://exampe.com/hoge/a/rss

名前的にはそれらしいカノニカル(正規化)はこのためには使えない。引用すると、絶対指定には使えないということがわかる。

このメソッドはURIの正規化されたものを返します。正規化のルールはスキームによって違います。通常はスキームとインターネット・ホスト名要素の小文字化、デフォルト・ポートと同じになっている明確なポート指定の削除、すべてのエスケープ・シーケンスの大文字化、普通に表現することができるエスケープされていオクテットの通常化です。

効率の理由から、$uriがすでに正規化されている形式であれば、コピーの代わりにそれへのリファレンスが返されます。

$uri->canonical;
print $uri;

リファレンス

  1. canonical perl uri - Google 検索
  2. URI - 定型資源識別子(Uniform Resource Identifiers) (絶対そして相対)
  3. perl path normalization - Google 検索
  4. URLs (Perl & LWP)
  5. 7-7. Unixパス名の安全対策
  6. perl パス ファイル 正規化 - Google 検索

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2009-06-17T08:21:00+09:00
  2. Modified: 2009-06-17T08:21:00+09:00
  3. Generated: 2017-08-22T23:09:31+09:00