Proxomitron のテキスト検索言語
Previous Back to contents Next

テキストの検索言語は、Proxomitron のフィルタがどのように働くのかを理解する鍵になります。複雑な HTML タグにマッチさせることができるようになりますし、マッチした部分を変数に入れておいて、後から置換テキストで利用したりできるようになります。

もしあなたが、DOS や UNIX で使われるファイル名のワイルドカード(*,?,[...])とか、正規表現に詳しければ、それが Proxomitron で使われるマッチングルールとよく似ていることに気が付くでしょう。実際、私自身のゴールは、ワイルドカードと同じくらい簡単に使えて、しかもそれに正規表現の力を加えた検索言語を作ることなのです。私がそれに成功したかどうかはわかりませんが、どうにかして動くようにはなりました! ;-)

もし、あなたがこのようなことに馴染みがないのであれば、まずは テキストマッチング入門 をご覧ください。

多くのルールは、特に HTML を取り扱うのに便利なようにデザインされています。たとえば、HTML において大文字と小文字の違いはほとんど重要ではありませんので、すべてのマッチングは大文字と小文字の違いを区別しません。 ですので、大文字と小文字を両方試すような手間を省くことができます。

Proxomitron のメタキャラクタ

これは Proxomitron の メタキャラクタ の全リストと、その機能です。

*アスタリスクは、あらゆる任意の文字列にマッチします。たとえば、「foo*bar」は、「foobar」や「fooma babar」、あるいは「foo goat bat bison bar」といったものにもマッチします。基本的には、アスタリスクは「アスタリスクの次にある文字列が見つかるまで、前方検索をする」という意味になります。
?クエスチョンマークは、任意の1文字にマッチします。たとえば「?oat」は、「boat」や「goat」、あるいは「<oat」といったものにもマッチします。
[abc...]角括弧は、'[' と ']' の間に書かれた任意の1文字にマッチします。ダッシュを使って、範囲を表すこともできます。つまり "[A-Z]" という表現は「A」から「Z」までの任意の文字にマッチしますし、"[0-9]" という表現では、任意の数字1文字にマッチします。もし、最初の文字が「^」の場合は否定を表し、括弧の中に示された文字 以外 の場合にだけマッチします。たとえば、"[^0-9abc]" という表現は、数字や「a」、「b」、「c」以外の1文字にマッチします。
[#n:n]特別な数字のマッチです。HTMLタグにおける、数字の範囲を簡単にチェックすることができます。たとえば、100 から 150 までの数字をチェックするには、"[#100:150]" のようにします。もし、2番目の数字が「*」だった場合、それは無限大として扱われます。たとえば、"[#40:*]" という表現は 40 以上のあらゆる数字にマッチします。40 以下の数字をチェックする場合は、単純に "[#0:40]" のようにしてください。特定の数字だけにマッチさせる場合には、2番目の数字を省略することができます("[#100]" のように)。数字のマッチでは、0 に続いて数字が書かれていたり、クオートに囲まれていてもマッチします( tag="0100" のように)。以前のバージョンの Proxomitron では、「:」の代わりに「-」を使用していました。しかしこのせいで、マイナスの値をチェックするのが大変でした。現在の Proxomitron はどちらのやり方も使うことができますが、もしマイナスの値をチェックする場合(たとえば [#-200:150] みたいに)、「:」の方を使用しなければなりません。

" "

スペースは 常に マッチします。しかし、スペースやタブは、その数に関係なくそこで 消費 されてしまいます。スペースが、存在する場合も存在しない場合もあり得るような場所に使用してください。たとえば、"<tag value>" という表現は、 "<tag value>" や "<tag   value>" 、 あるいは "<tagvalue>"といったものにもマッチします。
\sスペースと同様に、数に関係なくタブやスペースを消費してしまいますが、マッチするためには、少なくとも1つ以上は タブやスペースが存在しなければなりません。たとえば、"<tag\s>" という表現は "<tag >" や "<tag   >" にはマッチしますが、 "<tag>" にはマッチしません。
\wワードマッチです。これはスペースが含まれない任意の文字列にマッチします。基本的には「\s」の反対ですが、場合によっては「*」にも近くなります。違いは、この場合スペースか「>」(タグの終わりの記号です)があった場合、それ以上にはマッチしません。タグの値や、URL にマッチさせる場合に便利です。( tips and tricks を参照のこと)
\tタブ・キャラクタにマッチします。
\rキャリッジリターンにマッチします。
\nニューライン・キャラクタにマッチします。
\0-9マッチを変数に格納します。これは Proxomitron のマッチングルールの中でも、鍵になるものです。「*」と同じように任意の文字列にマッチしますが、そのマッチしたものを1から10までの変数に蓄えます。これらの変数は置換テキストで使用することで、蓄えられた元の HTML の一部分をそこに挿入することができます。タグの一部だけを変更して、他の部分は元のまま残しておきたいような場合に使用してください。たとえば、<body ... > タグの background だけを変更する場合には、以下のようにします。

Matching:<body \1 background="*" \2 >

Replace:<body \1 background="mybackground.gif" \2 >

このようにして、元のタグで background を指定する場所の前後にあった部分を、置換テキストに含めることができます。

もっと複雑なマッチも、括弧の直後にスペースをおかないで \0-9 を使用することで、取り込むことができます。たとえば、「(foo*bar)\1」のように。この場合、括弧の中でマッチしたものが変数に入ります。これは正規表現に似ていますが、どの変数を使用するか選べるので、さらに使いやすくなっています。

\#\0 から \9 と同じようにマッチしますが、これは、使われるたびに 置換スタック に値を入れていきます。これは、変数の古い値を新しい値で置き換える代わりに、後ろにくっつけていくようなものだと考えてください。たとえば、もし \# が最初に「foo」にマッチして、それから「bar」にマッチしたとすると、その両方を格納することになります。「\@」を置換テキストで使うことで、取り込まれた値をすべて出力します(この場合では「foobar」です)。
|縦棒は「OR」関数として使用します。たとえば、「foo|bar」という表現は、「foo」と「bar」のどちらにもマッチします。
&アンパサンドは「AND」関数として使用します。たとえば、「*foo&*bar」という表現は、「foo bar」や「bar foo」にはマッチしますが、「foo foo」にはマッチしません。アスタリスクを使用していることに注意してください。このように AND 関数を使用する場合には、常にアスタリスクが必要になります。だって「foo」と「bar」が 同時に同じ場所に 存在するなんてありえませんからね ;-) 。AND はタグの各要素がどんな順序で並んでいるかわからないような場合にも有効です。たとえば...

<img src="picture" height=60 width=200>

というタグは、以下のようにも書くことができます。

<img width=200 height=60 src="picture">

この両方が、以下のように書くことでマッチします。

<img (*src="picture" & *height=60 & *width=200)*>

&&ダブルアンパサンド(あるいは AND-AND)は、「&」を一つだけ使った場合と似た働きをします。重要な(そして便利な)違いは、この AND の後半部分は、前半部分でマッチした部分 だけ限定して マッチするということです。混乱しました? 実はとてもシンプルなことです。仮に、以下のような表現を使用したとしましょう。

(<img * > && \1 ) ...普通は、「\1」は「*」と同じように働きますので、ただの「&」が使用されていたとしたら、これは「<img 」から始まって、可能な限りの長さでマッチしてしまうでしょう(そして、イメージタグの終わりを通り過ぎてしまうでしょう)。AND-AND の場合は、マッチを <img ... > の中に限定しますので、それ以上にはマッチしません(つまり、\1<img ...> タグだけにマッチすることになります)。これは一種の範囲制限として使用することができ、「どこまでも行ってしまう」表現になるのを防ぐことができます。

( ... )括弧は、検索表現を階層化するのに使います。たとえば、「foo(bar|bear|goat)」という表現は、「foobar」や「foobear」、さらには「foogoat」にもマッチします。また、括弧は入れ子にすることができます。たとえば、「foo(bar|(black|brown|puce) bear|goat)」という表現は、「foobar」「fooblackbear」「foobrownbear」などにマッチします。"[...]" の場合と同様に、「(」の次にくる最初の文字が「^」であった場合には、括弧の中の表現に一致 しなかった 場合にだけマッチします。たとえば、「(^foo|bar)」という表現は、「foo」と「bar」以外のすべてにマッチします。否定の表現はどんな文字も消費しないことに気をつけてください。単に、テストするだけなのです。Perl ではこれを「negative forward assertion」と呼んでいますよね?
+プラス記号は文字の 繰り返し を指し示します。たとえば、「a+」という表現は、「a」や「aa」、「aaaa」などにマッチします。他のメタキャラクタや括弧と併用して、もっと複雑な文字の繰り返しにもマッチさせることができます。たとえば...

[abc]+   これは「a」「b」「c」のどんな繰り返しにもマッチします。たとえば「ababccba」のような。

([a-z]&[^n])+   これは、「a」から「z」までで、「n」を含まない文字の繰り返しにマッチします。

(foo)+   これは、「foo」、「foofoo」、「foofoofoo」などにマッチします。

+ で重要な点は、これは「盲目的な」マッチングをするということです。つまり、これは後ろに存在する文字列には お構いなし に 、テストしている条件が真である限り続くということを意味してます。たとえば、「(foo)+foobar」という表現は、絶対に マッチしません。どうしてかって? つまり、「(foo)+」という表現はすべての「foo」を使い果たしてしまうので、「foobar」のための「foo」が残されないのです! これは場合によっては便利に使えますが、そうではない場合には「++」を使うこともできます。

++2つ並んだプラスは、「+」一つだけの場合とほぼ同じように働きますが、こちらは後ろにくる文字列のことを常に考慮に入れます(いわば「目が開いている」、ということです)。これは表現の残りの部分がマッチするまでしか繰り返しません。普通の正規表現における「.」演算子の働きに非常に似ていると思います。
{n,n}「+」や「++」は、「中括弧」を後につけることができます。これは表現が繰り返す最小回数と最大回数を設定するために使用します。たとえば、"[a]+{4,10}" という表現は、4個から10個までの「a」の繰り返しにマッチします。また、"[b]+{20}" という表現では、厳密に20個の「b」にマッチします。アスタリスク「*」は 、無限大を表します。たとえば、"[c]+{10,*}" という表現は10個かそれ以上の「c」にマッチします。(これを読んでいる方の中にいらっしゃるであろう正規表現使いのみなさんに説明します。こちらの場合は必ず 「+」か「++」の後につけなければなりません。単独では使えませんのでご注意ください)
\バックスラッシュは、特別な意味を持った文字を「エスケープ」して、普通の文字として扱うために使用します。たとえば、HTML 内で使用されている括弧にマッチさせるには「\(」のようにしなければなりません。また、バックスラッシュ自体にマッチさせるには「\\」のようにします。(訳註:日本語のフォントでは、バックスラッシュは円記号「¥」に見えます)
=イコール記号にはある「マジック」があります。これは単に「=」にマッチするだけではなく、その前後にあるスペースにもマッチします。このおかげで、タグの値が簡単に扱えるようになっています。たとえば、「foo="bar"」という表現は、「foo= "bar"」や「foo = "bar"」にマッチします。
"ダブルクオート - これはダブルクオートにもシングルクオートにもマッチします(これは HTML ではどちらも使用されている可能性があるからです)。たとえば、「 " * " 」という表現は、次の両方にマッチします。

"oh happy mongoose" ...あるいは... 'oh happy mengeese'

もし、ダブルクオートに明示的にマッチさせたい場合は、バックスラッシュを使用してください。「\"」のように。

'シングルクオートは、普通のクオートよりも賢く使えます。つまり、この前にダブルクオートによってマッチしたクオートを 閉じるクオート にマッチしようとします。たとえその間に、別の種類のクオートがあってもです! 混乱しました? 大丈夫です。HTML では、「クオートの中でクオート」を使う必要がある場合、シングルクオートとダブルクオートを混ぜて使用するのは普通のことです。次の例をご覧ください。...

ダブルの中にシングル: href=" javascript:window.open( ' bison.html ' ); " or...

シングルの中にダブル: href=' javascript:window.open( " bison.html " ); '

この両方が、href=( " * ' ) でマッチします。ダブルクオートを始まりのクオートにマッチさせるために使い、シングルクオートを終わりのクオートにマッチさせるために使うだけです。ここで、少し制限があります。まず、始まりと終わりのクオートは両方とも同じ階層の表現になければなりません。つまり、同じ階層の括弧内に、ということです。たとえば、

" some text '   これはうまくいきます...

( " some text ' )    これも大丈夫です...

" ( some text | other text) '   これも大丈夫ですが... しかし

" ( some text ' )    これはうまくいきません

( " | ) some text ( ' | )   残念ながら、これもうまくいきません

もう一つの制限は、始まりと終わりのクオートは、同じ階層の表現で入れ子にすることはできない、ということです。下のような検索はうまくいきません。

" something " something else ' end of something '

しかし、別の種類の 階層を用いることで、入れ子にすることができます。たとえば、下のように。

" something ( " something else ' ) end of something '

もし、始まりのクオートとしてダブルクオートがマッチしなかった場合、シングルクオートは単にシングルクオートにマッチするだけだということにも気をつけてください。シングルクオートに明示的にマッチさせたい場合には、「\'」を用いた方が安全です。

 

特別な置換テキストのコード

マッチングルールに加えて、置換テキストに使える特別なコードがあります。

まず、「\0」から「\9」までは、検索表現で使用されてマッチした値を、置換テキストに挿入することができます。「\#」によって蓄えられた値は、「\@」を使って全部出力することもできますし、再度「\#」を使うことで、蓄えられた順番通りに一つずつ出力することもできます(たとえば、仮に3つのアイテムが蓄えられていたとすると、「\# \# \#」という表現を使うことで、それぞれのアイテムをスペースをあけて出力することができます)。

他にもいくつか、置換テキストで使用することのできる特別なコードがあります。

\u現在のウェブページの URL が格納されています
\k現在の接続を切断します。HTTP ヘッダで用いると、特定の URL へのアクセスを禁止することができますし、ウェブページフィルタで用いれば、それ以降のページの読み込みをスキップすることができます。
\hURL のホスト部分が格納されています。
\pURL のパスの部分が格納されています。
\qURL のクエリー部分が格納されています。(「?」に続く部分のことです)
\aURL のアンカーテキストが格納されています。(「#」に続く部分のことです)
\dProxomitron をインストールしたディレクトリが、「file://」の URL 形式で格納されています。
(イメージやデータを置き換えるのに使用することができます)
\x URL コマンドで使用するプレフィクスを設定している場合、それが格納されています。
この使用には注意してください! 偶然にプレフィクスをリモートサーバに教えてしまったりしないように。)

注:\h \p \q \a \u は、検索表現でも使用することができます。特に \h は、記載された URL がそのページと同じホストネームであるかどうか(あるいは別のサーバのものであるか)を調べるのに使えるでしょう。
(訳註:内部ではややトリッキーな調べ方をしているようです。トップレベルドメイン、およびセカンドレベルドメインがマッチするかどうかだけを調べているのかもしれません。これは gTLD ( .com/.net/.org など)では有効かもしれませんが、日本ではセカンドレベルドメインが固有ではないことが多いので、使いにくいかもしれません。)

 

マッチングコマンド(拡張機能)

通常のメタキャラクタに加えて、Proxomitron では特別な マッチングコマンド を使えるようになりました。これは通常のマッチングルールを拡張して、いろいろと便利な機能を追加するものです。これらはすべて「$」記号で始まり、大文字のコマンド名、それからコマンドのパラメータを記述する括弧「(...)」という形式になっています。たとえば、$LST(...) は、検索中の任意の場所で、ブロックリストを調べるために使用するコマンドです。例を見てみましょう。

<img * src="$LST(ImageURLCheck)" * >

これは、イメージタグ内の URL が、「ImageURLCheck」という名前のブロックリストにマッチするかどうか調べるものです。このようなコマンドが数多く用意されており、これらを使用することで、フィルタを簡単に作成できるようになるでしょう。上記の例では検索表現で使用していますが、置換テキストで(ものによっては両方で)使用するものもあります。詳細については ここ をクリックしてください。

このおかげで、新しい「メタ」キャラクタを増やしたり、コンフリクトを起こしたりすることなく、新しいコマンドを増やすことができるようになりました。

The End...?

これでルールは全部です。使い方の例が、tips and tricks にありますので、ご覧ください。


Return to main index