拡張マッチングコマンド
Previous Back to contents Next

通常の メタキャラクタ に加えて、Proxomitron では特別なマッチングコマンドを使うことができます。ファンクションコールに似ていて、これはマッチングルールを拡張し、メタキャラクタだけでは実現が難しい、あるいは不可能な各種の機能を追加します。基本的な形式は、以下のようになります...

$COMMAND(Parameter1, Parameter2, ...)

コマンドは「$」で始まりますが、この文字単独では特別な意味を持ちません。通常は、この文字を検索表現で使う場合も特にエスケープする必要はありません。唯一の例外は、検索するテキストが既存のコマンドと全く同じ文字列になる場合です。

もう一つ注記: 全てのコマンドが全ての場所で使えるわけではありません。検索表現でしか使えない機能もあり、置換テキストでしか使えないものもあります(一部のものは両方で使えます)。同様に、あるコマンドはヘッダフィルタでしか使えませんし、あるコマンドはウェブフィルタで使うようにデザインされています。このような制限については、以下のコマンド解説の中で記述されています。


マッチングコマンドのリファレンス

さて、これ以上面倒(ado)なことは置いといて(オーケー、もう一つだけ騒ぎ(ado)を ── アドゥ! ……さ、もうこいつは私のシステムからは出ていきました)、これがお望みのものです ── マッチングコマンドの(たぶん)完全なリストと、そのパラメータ(もしあれば)、それから基本的な使い方です。

クイックジャンプ: 探しているコマンドをクリックするか、順に見ていってください:

$ADDLST $ADDLSTBOX $ALERT $ASK $AV $AVQ $CON $CONFIRM $DTM $ESC $FILE $FILTER $GET $IHDR $INEST $JUMP $KEYCHK $LOCK $LOG $LST $NEST $OHDR $RDIR $RESP $SET $SETPROXY $STOP $TST $TYPE $UESC $UNLOCK $URL $USEPROXY $WESC

$ALERT(message text)

制限: 検索表現または置換テキスト
フィルタの種類: すべて

$ALERT は JavaScript の alert() 関数と似たような働きをします。このコマンドは、指定されたメッセージの書かれたダイアログボックスを表示します。特に何をするわけでもありませんが、デバッグや何が起こったのかをユーザに知らせるためには役に立つでしょう。表示するメッセージは固定されていないので、置換コマンド(\1\h など)を使用して、取り込んだテキストやホストネームなどを使用することができます。

$CONFIRM(message text)

制限: 検索表現または置換テキスト
フィルタの種類: すべて

$ALERT と同様に、$CONFIRM も指定されたメッセージの書かれたダイアログボックスを表示します。しかし、こちらの場合は「はい」「いいえ」のボタンが付いています。これはマッチングにおいて、「はい」の場合にはマッチしたものとして、「いいえ」の場合にはマッチしなかったものとして扱うことができます。これを使用することで、ユーザの選択に応じてフィルタの動作を変えることができます。

こちらも $ALERT と同様、置換コマンドはメッセージが表示される前に展開されます。

$ADDLST(ListName, text to add)

制限: 検索表現または置換テキスト
フィルタの種類: すべて

$ADDLST を使用して、現在ロードされている任意のブロックリストに新しい行を追加することができます。アイテムを追加するブロックリスト名と追加したいテキストを指定するだけで、その行がファイルに追加されます。置換コマンドは先に展開されるので、取り込んだ URL、ホスト名、その他フィルタで取り込まれたアイテムを簡単に追加することができます。ちょっとだけ注意: ページから取り込まれた物は信用しない方がいいでしょう。$WESC(...) コマンドを使用して、潜在的に問題を起こす可能性のあるマッチングコマンドを無効にしておくというのは良い考えです。たとえば...

$URL(http://\1)
$ADDLST(MyList, $WESC(\1))

これは \1 変数で取り込まれたものに含まれるすべてのワイルドカードを、通常のキャラクタになるようエスケープしています。

$ADDLSTBOX(ListName, [dialog title,] text to add)

制限: 検索表現または置換テキスト
フィルタの種類: すべて

$ADDLSTBOX も、現在ロードされている任意のブロックリストに行を追加するために使用されます。しかし、こちらの場合は Proxomitron の "Add to blockfile" ダイアログボックスを呼ぶことでそれを行っています。こちらの場合では、ユーザが追加する内容を編集したり、追加自体をキャンセルしたりする機会があります。これが検索表現で呼ばれた場合は、$ADDLSTBOX はユーザがアイテムを追加した場合にはマッチしたものとして、それ以外の場合にはマッチしなかったものとして扱われます。ダイアログのタイトルは指定してもしなくてもかまいませんが、指定した場合にはダイアログボックスのタイトルバーに表示されます。

$ASK(AllowList, DenyList, Prompt, item to add [, alt match])

制限: 検索表現のみ
フィルタの種類: すべて

$ASK は、そのサイトで特定のアイテムをフィルタするかどうか、ユーザに尋ねるプロセスを自動化します。これを使用するためにはまず、ユーザの選択を保存するための "Allow(許可)" リストと "Deny(不許可)" リストが必要です(リストは複数のフィルタで共有することができます)。"Prompt" はユーザが はい/いいえ の選択をする際に表示されるテキストです。"item to add" はどちらかのリストに追加されるアイテムです(どちらのリストに追加されるかはユーザの選択によります)。このコマンドはそのサイトの URL に対してマッチします(デフォルトでは)。$ASK はフィルタの検索部で使用されなければなりませんし、通常はチェックされている最後のアイテムになるべきです。ここで例を見てみましょう....

  Name="A foo filter"
  Active=TRUE
  URL="^$LST(AllowFoos)"
  Match="<foo\s*>&"
        "$ASK(AllowFoos, DenyFoos, You you want to Foo at...\n\h?, \h)"
  Replace="<NoFoosAllowed>"

ここで我々が行っているのは、"\h" を使用してどちらかのリストにホスト名を追加しているだけだということに注目してください。ここで $LOCK() やその他の似たコマンドを呼ぶ必要はありません - $ASK は、同じアイテムに対して2回同じことを尋ねないために、同様のことをやってくれます。またフィルタの URL マッチで、allow リストの "not" テストを行っていることにも注目してください。これがなくてもフィルタは動きますが、こうしておくのは良い考えです。もしそのアイテムが既に許可されている場合、そのサイトでこのフィルタを使用する必要は全くないからです。

通常 $ASK はサイトの URL に対してマッチしようとします(フィルタ自身の URL マッチに似ています)。しかし、その他のアイテムにマッチさせることも可能です。$ASK ではオプションとして "alternate match" を指定することができます。そして使用された場合には、それが "allow" と "deny" リストに対してマッチします。例を見てみましょう...

  Name="Filter applets by class"
  Active=TRUE
  Bounds="<applet\s*</applet>"
  Match="<applet*code=$AV(\1)*&"
        "$ASK(AllowApplet, DenyApplet,"
        "Do you you want to allow Java Applet\n[\1]?, \1, \1)"
  Replace="<AppletKilled>"

これはまずアプレットの "code" 属性にマッチし、それを変数 \1 に代入しています。次に $ASK が呼ばれ、そのページの URL ではなく、\1 の値が両方のリストに対してチェックされています。

最初戸惑いそうなことの一つに、$ASK はユーザが「いいえ」を選んだときに "true" を返し、「はい」を選んだときに "false" を返すということがあります。一見逆のようですが、これは物事を単純化するためにこうなっています。というのも、「はい」は通常、そのアイテムをフィルタしないということを表しているからです。

$AV(match)

制限: 検索表現のみ
フィルタの種類: IN ヘッダ、OUT ヘッダ、または検索表現

これは属性値(attribute's value)にマッチさせるために使用します。まず最初に構文を解析し、値を分離します ── クオートのあるなしなどは自動的に考慮されます。コマンド内のマッチは、属性値のみに制限されます。注意:値を囲むクオートはマッチの部分とはなりません。

たとえば、「Gargalishous!」という言葉を alt に含む全てのイメージにマッチさせるためには、以下の表現を使うことができます。

<img * alt=$AV(*gargalishous!*) *>

これは以下のようなものの全てに対して、うまく働きます。

<img src="foo" alt="My is this trout ever Gargalishous!">
<img src="foo" alt='Gee your hair is Gargalishous! Is that bison flavor?'>
<img src="foo" alt=JustRawGargalishous! >

マッチはクオートを含みませんが、クオートはコマンドによって消費されてしまいます。これは、もしあなたがクオートを含んだ全ての値を取り込みたい場合は、以下のような表現を使用することができる、ということを意味しています。

<img * alt=($AV(\1))\2 *>

この表現では \2 はクオートを含んだ全ての値を蓄えますが、\1 は値そのものを蓄えます。以下に例を挙げておきます...

<img src="foo" alt="Move all Zig!">

\1 = Move all Zig!
\2 = "Move all Zig!"

しかし、このための別の方法があります ── $AVQ() を使えばいいのです。

$AVQ(match)

制限: 検索表現のみ
フィルタの種類: すべて

これはマッチにあらゆるクオートを含むという点を除けば、$AV(...) と同様のものです。以下のように、単にアトリビュートの値を取り込みたいという場合に有効です...

<img * alt=$AVQ(\1) * >

これはあらゆる alt の値を \1 に取り込みます。

$DTM(format)

制限: 置換テキストのみ
フィルタの種類: すべて

$DTM を使って、日付、時間および接続情報を任意の置換テキストに入れることができます。これはシンプルな(大文字と小文字を区別する)フォーマット用の文字列を使って表示をコントロールします...

M = 月
D = 日
Y = 年
h = (12 時間制の時間)
H = (24 時間制の時間)
m = 分
s = 秒
t = 1000分の1秒 (ミリ秒)
a = (am/pm)
w = 曜日を表す3文字の省略形 (Sun,Mon,Tue,など)
I = インターネットフォーマットの UTC(協定世界時)
c = 現在の接続番号

いくつか短縮形もあります

T = H:m:s (24時間制の時間:分:秒)
U = M/D/Y (U.S. スタイルの日付)
E = D/M/Y (ヨーロッパスタイルの日付)
d = Y-M-D (データベーススタイルの日付)

たとえば、"年/月/日" を出力するには...

$DTM(Y/M/D)

12時間制で時間を出力するには...

$DTM(h:m:s a)

その両方を出力するには...

$DTM(Y/M/D h:m:s a)

これはページに日時を追加したり、$LOG や他の似たコマンドに情報を追加するのに便利に使えます。

また、日時を変数にセットすることで、フィルタ内でマッチさせることができます(ScoJo さんありがとう :-)。たとえば、午後9時から10時の間だけで動作するフィルタを作るには...

$SET(CHour=$DTM(H))$TST(CHour=[#19:20])

$KEYCHK(keycode list)

制限: 検索表現のみ
フィルタの種類: すべて

KEYCHK コマンドはフィルタテスト中にユーザーが押したキーの組み合わせをテストすることができます(たとえば、そのフィルタ自身をバイパスさせたり、ユーザーが特定のキーを押している場合には異なった動作をさせたりするなど)。他のマッチングテストと同じように働き、フィルタの検索部、もしくは URL マッチで使うことができます。マッチが完了すると、KEYCHK はテストされているキーがその瞬間に押されていれば "matched" を返します。ほとんどのキーは、その「シフトキーの押されてない」値を用いることでテストすることができます。しかし、特殊なキーもキャラットシンボル "^" で始めることでテストすることができます....

^C = CONTROL
^A = ALT
^S = SHIFT
^T = TAB
^F1 = ファンクションキー #1
^F2 = ファンクションキー #2
^32 = 仮想キーコード 32 (spacebar)
^65 = 仮想キーコード 65 ("A")

大文字と小文字を区別しないので、"^c" も "^C" も使うことができます。複数のキーの組み合わせもテストすることができます。たとえば...

$KEYCHK(^A^S) = ALT+SHIFT
$KEYCHK(^C^F6) = CONTROL+F6
$KEYCHK(^AG) = ALT+G
$KEYCHK(^C^A^S) = CONTROL+ALT+SHIFT

キーボードで押すことのできるあらゆる組み合わせで働きます。他の特殊キーも、もし Windows の仮想キーコードを知っていればテストすることができます ― これは 0-255 の数字です。たとえば、^2 はマウスの右ボタンをテストします。

$FILE(filename)

制限: 置換テキストのみ
フィルタの種類: すべて

$FILE コマンドを使えば、任意のファイルの内容をフィルタの置換テキストに挿入することができます。 たとえば...

Match="(^(^<BODY))"
Replace="<script>$FILE(c:/mystuff/myscript.js)</script>"
        "$STOP()"

このフィルタは作成した JavaScript を、 body タグの直前に挿入するというものです。

注意: Proxomitron はバックスラッシュ "\" (訳注:日本語フォントでは¥記号) をエスケープキャラクタとして使用しているため、ファイル名はスラッシュを使うか("c:/some/path/name")、エスケープされた(重なった)バックスラッシュを使う必要があります("c:\\some\\path\\name")。

また、ここではあるトリックを使用しています。検索表現の、(^(^...)) の部分に注目してください。シングルの "(^...)" は否定表現ですが、"(^(^...))" のような「ダブルネガティブ」表現とは何でしょう? これは逆の逆、つまり通常のマッチとほとんど同じように働きます ―― 一つの重要な違いを除いては。つまりこちらの場合では、文字列を消費しないのです! この意味するところは、何か(たとえば <body> タグ)を「使い果たして」しまうことなくテストできるということです。この方法を使えば、マッチさせたタグを再度置換テキストに入れる必要がありません。そして、multi-match オプションを使うことなく、他のフィルタでそのタグにマッチさせることができるのです!

このトリックにはもう一つ重要な機能があります。もしこのフィルタで multi-match を使用したとしたら、$FILE で挿入した内容が入力バッファに返されて、フィルタリングの対象となってしまいます。ネガティブ - ネガティブトリックを使えば、この問題に対処しつつその文字列を使用することが可能になります。同じタグに繰り返しマッチしないように、$STOP() のようなコマンドを使用することを忘れないでください!

$LOCK()

制限: なし
フィルタの種類: すべて

$LOCK コマンドを使うと、フィルタ内の一連のアイテムを一つの単位として扱うことができるようになります。任意の瞬間には、ただ一つのフィルタだけをロックすることができます。その時に $LOCK を呼んだ他のコマンドは ―― たとえそれが同時に読み込んでいる他のページ内であったとしても ―― 最初のフィルタ処理が完了するか、もしくは $UNLOCK が呼ばれるまで、待たなくてはなりません。これをもっとも有効に使えるのは、ユーザとのある種のやりとりをするようなフィルタ、たとえば "allow" もしくは "deny" リストにサイトを追加するかどうか選択させるようなものになるでしょう。ここで例を見てみましょう...

(some filter matching code)
& $LOCK()
(
  $URL(http://$LST(DenyList))|
  (^$URL(http://$LST(AllowList)))
  (^$CONFIRM(Allow Flash at:\n\h)
    $ADDLST(AllowList,\h)
    $STOP()
  )
  $ADDLST(DenyList,\h)
)

まずフィルタがロックされ、同じことをしようとしているフィルタはこちらが完了するまで待つことになります。次に、そのサイトが既に "deny" リストに登録されていないかチェックしています。もしそうならば、マッチしたことになり他には何もしません。もしそのサイトが "deny" リストに登録されていないならば、それが "allow" リストに登録されていないかどうかもチェックします。"allow" リストにも登録されていない場合は、ユーザに選択を求めます。ユーザの選択に基づいて、そのサイトを "allow" または "deny" リストに登録し、同じサイトについて繰り返し尋ねないようになります。

ごらんの通り様々なことが行われなければならず、またその間は処理が完了するまで他のページが同じチェックをしないようにすることが重要です。$LOCK は一連の処理が一つの単位として行われることを保証します。覚えておいて欲しいのですが、これはさまざまなことをスローダウンさせますので、本当に必要な場合以外は LOCK を呼ばないようにするべきでしょう。上記の例では、通常のフィルタマッチングはロックする部分より前に完了しています。

$UNLOCK()

制限: なし
フィルタの種類: すべて

$UNLOCK は $LOCK 関数の逆になります。ロックを解除し、それを待っている他のフィルタがロックできるようになります。また、UNLOCK はフィルタの処理が完了すると自動的に呼ばれます。通常は、特にロックを早く解除する必要のある場合にだけこのコマンドを呼べばいいことになります。

$LOG([!][RGBYVCWw]text to log)

制限: なし
フィルタの種類: すべて

$LOG は Prxomitron のログウィンドウにテキストを表示するために使用することができます(もしそれが開いている場合)。デバッグや、フィルタについてのさらに詳しい情報をログに追加するのに使えます。覚えておいて欲しいのですが、最初の文字は特別で、ログに表示されません。これは表示される文字の色を設定するために使用されます。たとえば...

$LOG(RThis will be red)

これは設定可能な色のリストです:

R= W= w=グレー B= G= Y= V=バイオレット C=シアン

大文字と小文字を区別することに注意してください。また、重要なメッセージのために、オプションとしてエクスクラメーションマーク "!" を色の識別子の直前に置くことができます。こうすることで、ログウィンドウが閉じていた場合にはそれを強制的に開くことができます...

$LOG(!R---This is Important---)

$LST(blockfile name)

制限: なし
フィルタの種類: すべて

これは検索表現内でブロックリストを読み込むために使用されます。ブロックリストの内容は、マッチするまで一行ずつテストされます。マッチしなかった場合、この表現は false を返します。

$NEST(start match, [inner match,] end match)

制限: 検索表現のみ
フィルタの種類: すべて (ただし、主にウェブフィルタ)

$NEST コマンドは、与えられたタグや文字列の始まりに対応する終わりのタグを、その間に同じタグが入れ子になっている場合でも見つけられるようにします。これを使用するためには、タグの始まりである「start match」と、タグの終わりである「end match」が必要です。たとえば、入れ子になった <TABLE> にマッチさせるには以下のようにします...

$NEST(<table*>,</table>)

これに以下のテキストが与えられると、赤で示された部分にマッチすることになります...

...some HTML...
<table name="outer table">
  ...
  <table name="inner table">
    ...
  </table>
  ...
</table>
...some more HTML...

内側で同じタグを使用したテーブルがあるにもかかわらず、正しい終わりのタグにマッチしていることに注目してください。

$NEST には、必要ならば第三の「inner match」パラメータを使用することができます。このパラメータが存在する場合、その表現は、マッチした始まりと終わりのタグの間で適用されます。これは重要なことなのですが、このマッチは、実際の始まりと終わりのタグ自身は含みません。その間にあるものだけに適用されます。もう一度、上記の例を使用しましょう...

$NEST(<table*>,\1,</table>)

これに以下のテキストが与えられると、「\1」は下の で表示された部分だけにマッチします。

...some HTML...
<table name="outer table">
  ...
  <table name="inner table">
    ...
  </table>
  ...
</table>
...some more HTML...

$INEST(start match, [inner match], end match)

制限: 検索表現のみ
フィルタの種類: すべて (ただし、主にウェブフィルタ)

$INEST ("Inner Nest") は、$NEST とほぼ同じように働きます。違いは、始まりと終わりのタグがコマンドの外に置かれている、というところです。言い換えれば、あなたが既に探しているタグを見つけていて、その終わりを見つけ出すことにだけ関心がある、ということを想定しています。$NEST で使った例で見てみると...

<table name=$AV(*outer*) >$INEST(<table*>,</table>) </table>

これに以下のテキストが与えられると、赤で表示された部分にマッチします...

...some HTML...
<table name="outer table">
  ...
  <table name="inner table">
    ...
  </table>
  ...
</table>
...some more HTML...

この利点は、同じ種類のタグの始まりに対して、特定のタグの始まり(この場合では、「outer」という名前を持つ table タグ)を見つけるのが簡単になる、ということです。これと同じことを $NEST でやるのは困難です。というのも、外側の入れ子の table だけではなく、内側のものに対しても、「start match」セクションが真になる必要があるからです。
(訳註:わかり難いので別の言葉で説明すると、この例で示されている HTML は、「<table…</table>」の入れ子ではあるけれども、「<table name="outer table">…</table>」の入れ子ではない、よって「outer」という名前を持つテーブルタグの入れ子を $NEST で判別することはできない、ということです。)

$SET(\# or \0-\9=Value)
$SET(Variable=Expanded Value)

制限: 検索表現または置換テキスト
フィルタの種類: すべて

$SET コマンドにはやや異なった2つの役割があります。まず、数字の変数に特定の値をセットするために使用されます。他の変数を含む、あらゆる置換テキストをここにセットすることができます。最初のパラメータは変数 \0 から \9、または置換スタックの変数である \# になります(「\」をつけるかどうかは任意です)。次にイコール「=」とセットする値がきます。たとえば...

\1「foobar」 をセットする: $SET(1=foobar)

\1\2 の内容を入れてセットする: $SET(1=Two is \2)

$SET コマンドを検索表現の内部に置くことで、各種の値を、検索表現が「そのポイントにきたときだけ」セットすることができます。これを使えば、if/then/else といった効果をもたらすことができます...

Match: name=(
   one $SET(0=Naoko) | 
   two $SET(0=Atsuko) |
   three $SET(0=Michie) | 
   $SET(0=Default))
Replace: "\0 Matched"

これは以下のような結果になります...

if name=one then "Naoko Matched"
if name=two then "Atsuko Matched"
if name=three then "Michie Matched"
else "Default matched"

set コマンドには少し制限があります: 変数がセットされた値は、それが実際に置換テキストで呼ばれるまでは「展開」されません。仮に \1 が「fish」で、$SET(\2=\1 food) のように SET コマンドを使用したとすると、\2 は「fish food」にはならず、文字通り\1 food」がセットされる、という意味です。しかし、\2 が置換部で出力されるときには「fish food」というように展開されます。なぜこれが重要かって? つまり、これが意味することの一つは、自分自身を含んだ変数をセットすることができない、ということです。$SET(\1=something and \1) みたいにはできません。

しかし、まだ希望を失わないでください ― このために、$SET は 2つめの 役割を持つことになりました ― バージョン Naoko 4.5 からは、Proxomitron は 「グローバル変数」 の概念を持つことになりました。これは名前を付けられた変数で、フィルタの任意の地点で(あるいはヘッダで)セットすることができ、そのリクエストが続いている間はセットされたまま保持されます。一度セットされると、その変数はそのフィルタの後半や、あるは全く別のフィルタからでもアクセスすることができます。

グローバル変数は英数字(a-z と 0-9)の名前を持ちますが、英字で始まらなければなりません。変数をセットするには...

$SET(VarName=some value)
$SET(Chiyo=tensai)
$SET(Osaka02=atamaga warui)

数字の変数の場合と同様に、値には置換コマンドを使うことができます ― しかし数字の場合と違って、こちらでは $SET が呼ばれた時点で完全に展開されます。そのため、チェックの後半でそのフィルタ自体がマッチしなかったとしても、変数をセットすることができます。また変数に自分自身をセットすることができます(以下の $GET コマンドを参照してください)。

グローバル変数をクリアするには、以下のように $SET を使ってください...

$SET(VarName=)

もしその変数をもう使わないということがわかっているならば、こうしてクリアしておいた方がメモリの節約になりますし、他の変数を調べる場合のスピードも向上します。

$GET(VariableName)

制限: 置換テキストのみ
フィルタの種類 すべて

$GET コマンドは置換テキストとして使うことができ、$SET (上記を参照のこと)で作成されたグローバル変数の現在の値を挿入します。これは他の $SET コマンドの中でも使うことができます。たとえば...

Match: <a * href=$AVQ(\1)$SET(LinkURL=>>\1<<) *>
Replace: "The linked URL was: $GET(LinkURL)"

"\1" のような数字の変数とは違って、グローバル変数は、同じリクエスト内である限り他のフィルタからでも取得することができます。そのため、あるフィルタがページの一番上でテキストを取り込んでおいて、そのページの一番下で別のフィルタがそれを使うこともできます。また、$SET と $GET を組み合わせて使うことで、変数を「育てていく」ことも可能です ― たとえば...

$SET(foo=$GET(foo) more stuff) ... "foo" の終わりに付け加えます
$SET(foo=more stuff $GET(foo)) ... "foo" の前に付け加えます
$SET(foo=$GET(foo) \1)         ... "foo" の終わりに "\1" の値を付け加えます
$SET(foo=$GET(foo)$GET(bar))   ... "foo" の終わりに "bar" の値を付け加えます
注意して欲しいのですが、$GET は 名前の付けられた 変数のみで使用されますので、"$GET(\1)" のように数字の変数では 使いません ― この場合であれば、単に "\1" を使えばいいのです。

$TST(\# or \0-\9=Matching expression)
$TST(VariableName=Matching expression)
$TST(VariableName or \# or \0-\9)

制限: 検索表現または置換テキスト
フィルタの種類: すべて

$TST コマンドはグローバル、または数字の変数が特定の値にマッチするかどうかテストするために使われます。たとえば...

$TST(Chiyo=*(tensai|short)*)

これは変数 "Chiyo" が "tensai" または "short" という語を含んでいた場合に true を返します。もう一つ例を見てみましょう...

Match: <img * height=$AV(\1) * > $TST(\1=[#10-40])

これは "\1" が 10 から 40 の数字であった場合にだけ "true" となります。

また、$TST がマッチするためには、値の 全長 がマッチする必要があります。変数のテキストの一部にだけマッチさせる場合には、最初の例のように、始めと終わりをアスタリスク "*" で囲ってください。

$TST にはもう一つおまけがあります ― マッチを外に出しておくことで、現在マッチしているテキストに対してその値をテストすることができます。これは、たとえば、現時点でどのタグかわからないタグの始まりに対して、そのタグの終わりを見つけることができるのです...

Match: <([a-z]+)\1 * </$TST(\1)>

これは "<AnyTag> stuff </AnyTag>" にはマッチしますが、"<AnyTag> stuff </ADifferentTag>" にはマッチしません。注意しなけらばならないのは、大文字と小文字の違い以外は、厳密にマッチする必要があるということです。変数の値はすべてプレーンテキストとして扱われ、ワイルドカードとしては扱われません。

速度を上げるには: $TST は変数を調べる必要があるため、通常のマッチよりは多少遅くなります。もし可能ならば、フィルタ内で通常のマッチよりも 後ろに 置いた方がいいでしょう。また、"*" のようなワイルドカードを直前に置くのは避けてください。たとえば...

遅い例: <a *$TST(foo=*bar*)</a>
良い例: <a *</a>$TST(foo=*bar*)

これは $TST がチェックされる回数を劇的に減少させます。

$CON:(x,y[,z])

制限: 検索表現のみ
フィルタの種類: すべて

これは現在の接続番号が y のうちの x である場合だけ true になります(オプションとして「z の接続おきに」)。接続をベースにして値を入れ替えるのに使用できます。たとえば、下の例では \0 に3種類の値を順に入れ替えています。

($CON(1,3) $SET(0=Value one of three)|
$CON(2,3) $SET(0=Value two of three)|
$CON(3,3) $SET(0=Value three of three))

「z」オプションを使用すれば、その接続回数だけ入れ替えの間隔を空けることができます。

$IHDR(header-name:matching)
$OHDR(header-name:matching)

制限: 検索表現または置換テキスト
フィルタの種類: すべて

$OHDR と $IHDR は、送受信する HTTP ヘッダの値を個別にテストするために使用します。まずテストしたいヘッダ名を記述し(ここでワイルドカードは使用できません)、後ろにヘッダの値に対するマッチを書きます(こちらはワイルドカードを使用できます)。このコマンドは、名前で指定されたヘッダの値が「matching」の部分にマッチした場合にのみ、true を返します。$OHDR は送信する (outgoing) ヘッダをテストし、$IHDR は受信する (incoming) ヘッダをテストします。たとえば、以下は「Referer」ヘッダが「microsoft.com」を含む場合にのみマッチします。

$OHDR(Referer:*.microsoft.com)

これらのコマンドを使用することで、ヘッダが特定の値だった場合にのみウェブフィルタをマッチさせるようにできますし、ヘッダの値を変数に入れておいて、フィルタの置換に使用することもできます。また HTTP ヘッダフィルタに使用して、マッチに複数のヘッダの値を参照することもできます。

$RESP(matching)

制限: 検索表現または置換テキスト
フィルタの種類: すべて

$RESP コマンドはウェブサーバから返されたレスポンスコードにマッチさせ、あるいは取り込むことができます(レスポンスコードは ログウィンドウで見ることができます)。通常、これは "200 OK" とか "404 Not Found" のような形になっています。

マッチは返されたコードから直接始まるので、応答における "HTTP/x.x" の部分を含めないでください。このコマンドは3桁の数字で表されるステータスコードと、通常はその後ろに記述されている説明テキストのみにマッチします。たとえば、サーバリダイレクトにマッチさせるには、"$RESP(302*)" を使うことができます。このコマンドはログファイルに記述するための情報を取り込むことにも使えるでしょう。

$URL(matching value)

制限: 検索表現または置換テキスト
フィルタの種類: すべて

$URL は、フィルタの検索表現の部分で URL をテストするのに使用します。通常はフィルタの URL マッチをこの目的に使用しますが、このコマンドを使用することで、マッチしたテキストに基づいて別々の URL をチェックすることができます。また、URL の一部分を変数に取り込むためにも有効に使うことができます。以下は URL の path の部分を取り込む例です...

$URL(http://www.somehost.com/\1)

注意: URL マッチングは現在では URL のプロトコルの部分をテストに含むようになりました(たとえば、"http://")。Proxomitron は現在では HTTP 以外のものも扱いますので、この方が便利に使えると思います。しかし、これは以前のバージョンから変更された点なので、古いフィルタは調整する必要があるかもしれません。

$TYPE(code)

制限: 検索表現のみ
フィルタの種類: ウェブフィルタ

Content Type をチェックするコマンドです。このコマンドは、フィルタの適用範囲をページのタイプによって制限するのに使用することができます(たとえば、 JavaScript ファイルのみ、のように)。「code」は以下のうちのどれかでなければなりません。

htm- ウェブページ
css- カスケーディングスタイルシート
js- JavaScript
vbs- VB スクリプト
oth- その他

これはウェブフィルタ、特にその URL マッチで便利に使えるでしょう。この値は、ヘッダフィルタでは定義されません(content-type はその時点ではまだ判明していないかもしれないからです)。これは速くて単純なチェックだということを覚えておいてください。もっと複雑な content-type のチェックをするためには、「$IHDR(Content-Type:some matching value)」の書式を用いることができます。

$RDIR(http://some.url.com/)

制限: 検索表現または置換テキスト
フィルタの種類: IN または OUT ヘッダフィルタのみ

$RDIR (redirect) コマンドを使えば、URL を透過的に他の場所にリダイレクトすることができます。ローカルファイルにリダイレクトするために、URL コマンドの「http://file//filename」の書式を使用することもできます。新しい URL は Proxomitron が理解できるタイプでなければなりません( http、あるいは SSLeay を使用していれば、https )。

$RDIR と $JUMP (以下を参照のこと)コマンドは ヘッダ フィルタの置換セクションのみで使用してください。これは重要なことなのですが、送信するヘッダで使用された場合のリダイレクトは本来のサイトにコンタクトされる前に行われるのに対して、受信するヘッダで使用された場合には、最初のサイトにまずコンタクトしなければなりません。これらのコマンドは、ウェブフィルタで使用されても効果がありません。その時点までにオリジナルページが既に読み込まれ始めているからです。このようなケースでは、新しい場所へ飛ばすために JavaScript を使用することができるでしょう。こんな風に...

<script> document.location="http://some.new.url/"; </script>

$JUMP(http://some.url.com/)

制限: 検索表現または置換テキスト
フィルタの種類: IN または OUT ヘッダフィルタのみ

$RDIR と似ていて、$JUMP コマンドは URL を別の場所にリダイレクトするために使用されます。けれども、透過的なリダイレクトのかわりに、これはブラウザに対して新しい場所に行くよう指示することで働きます。これはドキュメントの中で「meta」タグを使用したり、JavaScript のなかで document.location を使用したりしてページをリフレッシュするのに似ています(実際、これはブラウザに 302 のリダイレクトコマンドを送信しています)。

$JUMP を使用すれば、ブラウザはページがリダイレクトされたことを知ることができ、表示される URL も新しい URL を反映したものになるでしょう。$RDIR がイメージや Java アプレットのようなページ内の特定の要素を不可視的にリダイレクトするのに向いているのに対して、これはページ全体をリダイレクトするのにはベストの方法です。「舞台裏」でこっそりとリダイレクトさせるためには $RDIR を用い、リクエストされたサイトから単に別の場所へ行かせたい場合には $JUMP を使用してください。

$STOP()

制限: 検索表現または置換テキスト
フィルタの種類: すべて

$STOP は非常にシンプルなコマンドです。フィルタの検索表現や置換テキストで使用されると、$STOP はそのページ/接続において、以降はそのフィルタをオフにします。その際に行われているマッチは完了できますが、一度実行されると、それ以降そのフィルタでマッチすることはありません。

これは一度だけマッチさせたいようなフィルタで便利に使うことができます。特に、ページの特定の場所に何かを挿入するようなフィルタです。たとえば、<BODY> タグの後ろに短いスクリプトを挿入するとしてみましょう。その場合には以下のようにすることができます。

Match:<body\s \1>
Replace:<body \1>
<script>my script</script>
$STOP( )

これは、スクリプトが複数回挿入されないようにするだけではなく、Proxomitron がそれ以降無駄な検索をしなくなるので、スピードを向上させる効果もあります。また、フィルタが全体としてマッチしなかったとしても、フィルタ内のどこかでこのコマンドが呼ばれていた場合にはその動作をするようになりましたので、注意してください。

$FILTER(True or False boolean value)

制限: 検索表現または置換テキスト
フィルタの種類: IN または OUT ヘッダフィルタのみ

$FILTER コマンドは、特定のリクエストをそのタイプに関係なく、強制的にフィルタリングさせたり、あるいはさせなかったりするために使用します。通常は特定のタイプのみがフィルタリングされています(たとえば text/html、text/css、image/gif など)。$FILTER は任意のヘッダフィルタの検索表現、もしくは置換テキストで使用することができ、「true」または「false」をとります。もし true であれば、そのリクエストはタイプに関係なくウェブフィルタが適用されます。これはテキストベースのコンテンツに対してのみ意味を持ちます。

また、ヘッダフィルタの URL マッチとともに使用することで、特定のアニメーション GIF が「フリーズ」するのを避けることができます。

例を見てみましょう...

Out = "True"
Key="URL: Don't freeze this gif"
URL="www.somewhere.com/animate_me.gif"
Replace="$FILTER(False)"

$USEPROXY(True or False boolean value)

制限: 検索表現または置換テキスト
フィルタの種類: OUT ヘッダフィルタのみ

$USEPROXY コマンドも「true」もしくは「false」をとります。これは特定の接続に対して、「Use remote proxy」の設定を上書きし、その接続に対するプロクシのオン/オフを切り替えます。これを使えば、特定のサイトやアクションに対して、確実にプロクシを使用する、あるいは使用しない、といった設定をすることができます。

効果を持つためには、このコマンドは送信する(outgoing)ヘッダフィルタの検索表現、または置換テキストで呼ばれなければなりません。これは、プロクシセッティングはそのサイトへの接続に先立って確立されなければならないためです。

$SETPROXY(remote.proxy.name[:port])

制限: 検索表現または置換テキスト
フィルタの種類: OUT ヘッダフィルタのみ

$SETPROXY コマンドは、その接続に対して強制的に特定のプロクシを使用させます。これは「Use remote proxy」のチェックボックスと、現在選択しているプロクシの両方に優先します。これを使うと、特定の状況や URL に対して、確実に特定のプロクシを使用するように設定できます。

セットするためのプロクシは、外部プロクシセレクタの中に既に存在するものでなければなりません。このコマンドは単純にそのリストを参照して、プロクシをセットするだけなのです。通常は、セットするプロクシ名は最初の何文字かを入れるだけで構いません ── リストの中で最初にマッチしたプロクシが使用されます。けれども、マッチさせる部分は厳密でなければなりません(つまりワイルドカードは使用できません)。

前のコマンドと同様に、このコマンドも送信する(outgoing)ヘッダフィルタの検索表現、または置換テキストで呼ばれなければなりません。

$UESC(escaped text)

制限: 置換テキストのみ
フィルタの種類: すべて

$UESC コマンドは JavaScript の unescape() コマンドのようなものにしようと作成されました。これはほとんどの URL エスケープされたキャラクタを ASCII の形に戻します。これは他の URL に埋め込まれた URL(クリックを追跡するのに最近よく使われている手法です) をアンエスケープするのに有効です。しばしば、「:」とか「/」のようなキャラクタが、16進で相当する形(「%3A」と「%2F」)にエスケープされ、実際の URL を使用しづらくしています。

$UESC はフィルタの置換テキストで使用することができ、有効な置換テキストは全て入力に使用できます(たとえば変数 \1 のような)。これはほとんどのエスケープされたテキストをその正しい姿に戻しますが、スペースと、全ての表示できない ASCII キャラクタはエスケープされたまま残ります。

$ESC(any text)

制限: 置換テキストのみ
フィルタの種類: すべて

$ESC コマンドは、$UESC コマンドの逆になります。JavaScript の escape() コマンドに似て、これはほとんどの英数字以外のキャラクタを、16進にエスケープされたコード(%xx の形です)に変換し、URL の一部として使用しても安全なようにします。

$ESC はフィルタの置換テキストで使用することができ、有効な置換テキストは全て入力に使用できます(たとえば変数 \1 のような)。

$WESC(any text)

制限: 置換テキストのみ
フィルタの種類: すべて

$WESC は $ESC と似ていますが、こちらは Proxomitron で使用しているワイルドカードやマッチングコマンドをエスケープするためにデザインされています。取り込んだテキストをブロックファイルに追加したいが、それに *? のようなワイルドカードが含まれている可能性があるような場合に便利に使えます。

$WESC はフィルタの置換テキストで使用することができますが、もし検索部のコマンド内($ADDLST や $ADDLSTBOX など)で使用された場合には、その入力に対して置換の展開を行います。


Return to main index