DLのためのProxomitron(6)
前回から引き続いてAvi-Banなんですが、基本的な書き方はDLのためのProxomitron(4)と変わりません。変わらないんですが、以前書いた話だけでは「動く」フィルタを書けないと思うので一歩(だけ)レベルを上げて解説します。
まず素直にフィルタを書いてみましょう。
また、今回のメインテーマとは関係ないんですけど
と、いう、上の方針を使ってDLのためのProxomitron(4)の□5まで作業を進めたスクリーンショットが下。

何が起きてしまったか分かりますか?「*」を使い
何故こんなことが起きてしまったのか、分析してみましょう。
そして、問題はその次。「(*)\1.(*)\2」というのは、つまり「『.』によって分割し、前を\1に、後ろを\2に代入する」ということなんですけど、「http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg」には「.」が複数含まれている。つまり、これだけでは「何処で\1と\2を分割するのか」という点が不明確なのです。
一言で言うと、これがワイルドカード「*」の限界であり、正規表現の必要性です。別にProxomitronに限らずプログラミングでも文章執筆でもファイル検索でも同じなんですけど、ワイルドカードは常にこういう限界を持っている。この連載では、いわゆる「分からない人には何を意味しているのか完全不明な正規表現」とか「Proxomitron独自ルール」とかには話を展開させず、下記三つの方法を紹介します。
ただ、この場合は問題なかったんですけど、Proxomitronは変数の個数に上限がある(\10とかは無理)ので、この方針ではどうにもならない場合もあります。

本当のことを言うと、ここまで細かく分割する必要はありません。この場合「.」によって連番部分と拡張子が分割されているので、可変部分に「.」が含まれる(photo1.avi.jp)ことが問題なんです(だから区切れが不明確になって意図しない変数代入が行われる)。
ということで
ワイルドカード「*」は「あらゆる文字列」です。そして「あらゆる文字列を\Nに代入する」が「(*)\N」でした。「あらゆる」ではなくて、代入される文字列のパターンを限定してしまう。この場合「画像の拡張子」というのは「jpg」「png」「gif」のいずれかです。「(jpg|png|gif)\N」とすると、「jpgかpngかgifのどれかを\Nに代入する」の意味になります。

\2には「jpg」「png」「gif」のいずれかしか代入されない。
また、DLのためのProxomitron(2)で書いたんですが、Proxomitronの「Match」は大文字でも小文字でも関係がないです(Matchを「a cat〜」にすると「A cat〜」も書き換えられる、という話を書きました)。なので「(jpg|Jpg|JPG|png|Png|PNG|gif|Gif|GIF)\2」とかする必要はないです。

\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に限らず様々な場面で解決能力が高まると思うので、何とか試行錯誤して「動く」フィルタを書いてみて下さい。

まず素直にフィルタを書いてみましょう。
- サムネイル画像の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」に
また、今回のメインテーマとは関係ないんですけど
<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">
- サムネイル表示部分ソースの「<input type="image" src="」がMatchの「<input type\="image" src\="」に対応する
- サムネイル表示部分ソースの「http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg」がMatchの「(*)\1.(*)\2」に対応する
- サムネイル表示部分ソースの「" alt="無料レンタル掲示板 Avi-Ban" name="submit">」がMatchの「" alt\="* Avi-Ban" name\="submit">」に対応する
そして、問題はその次。「(*)\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
一言で言うと、これがワイルドカード「*」の限界であり、正規表現の必要性です。別に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」のいずれかしか代入されない。
「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: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通りも「あり得てしまう」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:変数に代入される文字数を限定する
「*」は「あらゆる文字列」なんですけど、これってつまり- どんな文字でもいい
- どんな文字数でもいい

\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に限らず様々な場面で解決能力が高まると思うので、何とか試行錯誤して「動く」フィルタを書いてみて下さい。


TrackBack
この記事へのトラックバックHow to stop taking ambien.
Buy ambien.