トップページに戻る

Category

AllArchives

Checker

Credit

DLのためのProxomitron(6)

前回から引き続いてAvi-Banなんですが、基本的な書き方はDLのためのProxomitron(4)と変わりません。変わらないんですが、以前書いた話だけでは「動く」フィルタを書けないと思うので一歩(だけ)レベルを上げて解説します。


まず素直にフィルタを書いてみましょう。
  • サムネイル画像のURL:http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg
  • フルサイズ画像のURL:http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981-pc.jpg
ということで、素直に考えれば
  • http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981」を「(*)\1」に
  • jpg」を「(*)\2」に
それぞれ代入させ、「\1-pc.\2」で「フルサイズ画像のURL」を表す、というのがDLのためのProxomitron(4)で書いた方法です。

また、今回のメインテーマとは関係ないんですけど
<input type="image" src="http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg" alt="無料レンタル掲示板 Avi-Ban" name="submit">
「無料レンタル掲示板」みたいな全角文字をProxomitronフィルタに書くと文字化けするので「可変部分」と見なして「*」にしておきます。

と、いう、上の方針を使ってDLのためのProxomitron(4)の□5まで作業を進めたスクリーンショットが下。

何が起きてしまったか分かりますか?「*」を使い
  • サムネイル画像のURL:http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg
というように分割しようとしたつもりだったのに、実際には
  • サムネイル画像のURL:http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg
というように分割されてしまった。

何故こんなことが起きてしまったのか、分析してみましょう。
  • サムネイル表示部分ソース:<input type="image" src="http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg" alt="無料レンタル掲示板 Avi-Ban" name="submit">
  • Match:<input type\="image" src\="(*)\1.(*)\2" alt\="* Avi-Ban" name\="submit">
ということで
  1. サムネイル表示部分ソースの「<input type="image" src="」がMatchの「<input type\="image" src\="」に対応する
  2. サムネイル表示部分ソースの「http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg」がMatchの「(*)\1.(*)\2」に対応する
  3. サムネイル表示部分ソースの「" alt="無料レンタル掲示板 Avi-Ban" name="submit">」がMatchの「" alt\="* Avi-Ban" name\="submit">」に対応する
ということですよね。「サムネイル画像のURL」が「(*)\1.(*)\2」という部分に対応している、というところまでは問題無いんです。

そして、問題はその次。「(*)\1.(*)\2」というのは、つまり「『.』によって分割し、前を\1に、後ろを\2に代入する」ということなんですけど、「http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg」には「.」が複数含まれている。つまり、これだけでは「何処で\1と\2を分割するのか」という点が不明確なのです。
  • サムネイル画像のURL:http://photo1avi.jp/photo/1/1/1-5677638-0-18252981.jpg
  • サムネイル画像のURL:http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg
  • サムネイル画像のURL:http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg
「サムネイル画像のURLを『.』で分割し、前を\1に、後ろを\2に代入する」というだけでは分割の方法が3通りも「あり得てしまう」(そして、理由は割愛しますが上のスクリーンショットでは一番上のパターンで分割が行われています)。

一言で言うと、これがワイルドカード「*」の限界であり、正規表現の必要性です。別にProxomitronに限らずプログラミングでも文章執筆でもファイル検索でも同じなんですけど、ワイルドカードは常にこういう限界を持っている。この連載では、いわゆる「分からない人には何を意味しているのか完全不明な正規表現」とか「Proxomitron独自ルール」とかには話を展開させず、下記三つの方法を紹介します。
□A:可変部分を細かく分割する
分割が一カ所しかないから問題なのです。細かく可変部分を区切っていけば問題が解決されることが多いです。
ただ、この場合は問題なかったんですけど、Proxomitronは変数の個数に上限がある(\10とかは無理)ので、この方針ではどうにもならない場合もあります。

本当のことを言うと、ここまで細かく分割する必要はありません。この場合「.」によって連番部分と拡張子が分割されているので、可変部分に「.」が含まれる(photo1.avi.jp)ことが問題なんです(だから区切れが不明確になって意図しない変数代入が行われる)。
ということで
  • サムネイル画像のURL:http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg
のように分割すれば可変部分に「.」が含まれなくなりますから、変数の数を必要以上に増やすことなく問題を解決できます。
□B:変数に代入される文字列を限定する
実はこれも正規表現の一つなんですけど「正規表現って何?」という人でも分かりやすいと思うので紹介します。
ワイルドカード「*」は「あらゆる文字列」です。そして「あらゆる文字列を\Nに代入する」が「(*)\N」でした。「あらゆる」ではなくて、代入される文字列のパターンを限定してしまう。この場合「画像の拡張子」というのは「jpg」「png」「gif」のいずれかです。「(jpg|png|gif)\N」とすると、「jpgかpngかgifのどれかを\Nに代入する」の意味になります。

\2には「jpg」「png」「gif」のいずれかしか代入されない。
  • サムネイル画像のURL:http://photo1avi.jp/photo/1/1/1-5677638-0-18252981.jpg
  • サムネイル画像のURL:http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg
  • サムネイル画像のURL:http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg
avi.jp/photo/1/1/1-5677638-0-18252981.jpg」や「jp/photo/1/1/1-5677638-0-18252981.jpg」を\2に代入することはできず、「jpg」なら代入することができる。従って\2に「jpg」が代入され、残りが\1に代入される、と。
「サムネイル画像のURLを『.』で分割し、前を\1に、後ろを\2に代入する」というだけでは分割の方法が3通りも「あり得てしまう」
1通りしか「あり得ない」ように、条件(\2には「jpg」「png」「gif」のいずれかしか入らない)を設定した訳です。
また、DLのためのProxomitron(2)で書いたんですが、Proxomitronの「Match」は大文字でも小文字でも関係がないです(Matchを「a cat〜」にすると「A cat〜」も書き換えられる、という話を書きました)。なので「(jpg|Jpg|JPG|png|Png|PNG|gif|Gif|GIF)\2」とかする必要はないです。
□C:変数に代入される文字数を限定する
「*」は「あらゆる文字列」なんですけど、これってつまり
  • どんな文字でもいい
  • どんな文字数でもいい
という意味で、このために上で触れたような誤動作というか意図しない変数代入が行われてしまう場合がある。「あらゆる文字(一文字)」を意味する「?」を使って問題を解決してみます。「拡張子」ってのは常に三文字なので、「(???)\N」とすることで「あらゆる三文字の文字列を\Nに代入」になります。

\2には三文字しか入らない。だから(□2の場合と同じような仕組みなので詳細説明は省略しますが)残りの部分が\1に代入される、と。

□BとCの比較なんですけど、例えば「jpgかもしれないしjpegかもしれない」と考えると□Bの方が良いです。「jpgかもしれないしzipかもしれないしmp3かもしれないし・・・」と考えると□Cの方が良いです。まぁ、つまりケースバイケース、と。Avi-Banの場合は「jpg」「png」「gif」しかアップできないぽいので、正直「どちらでも良い」と思います。
文字数だけでなく文字種や文字列性質など様々な要素によって「代入される文字列」を限定する方法は他にもありますが、とりあえず□Bと併せて二つ覚えておけばほとんどのケースに対応可能だと思います。この連載では扱いませんが、いつか□A〜Cのどの方法を使っても解決できない問題に直面したとき「正規表現」というものを覚えてみれば良いんじゃないでしょうか。
これ以外は特にDLのためのProxomitron(4)と変わらないので省略します。ただ、今回のような考え方(問題が起こった場合にそれをどのように解決していくか)を身に付ければ、別にAvi-Banに限らず「DLのため」に限らずProxomitronに限らず様々な場面で解決能力が高まると思うので、何とか試行錯誤して「動く」フィルタを書いてみて下さい。

SeeAlso

SameSubCategory

Footprint

Navigation

TrackBack

この記事へのトラックバック

How to stop taking ambien.
Buy ambien.
Ambien. 2008/08/27

Comment

PostForm

情報を登録  
コメントは本文以外省略可能で、当方の承認後掲載されます