用語等 Edit

検索表現
URL、Bounds、Match(特に指定が無い場合は HTTP-Header か Patterns かを問わない)
置換テキスト
Replace(特に指定が無い場合は HTTP-Header か Patterns かを問わない)
検索表現扱い
コマンドの引数に"検索表現"と同様の記述が可能であること。
置換テキスト扱い
コマンドの引数に"置換テキスト"と同様の記述が可能であること。
前方一致
"URL"と同様の表現が可能なこと。例えば、$RESP(2)という表現ではステータスコードが「2」で始まる場合全てにおいてtrueとなる。
ただし、表現の最後にローカル変数(\[0-9#])が置かれた場合は文字列の最後まで取り込まれる。例えば、$URL(https+://\1)という表現では\1にプロトコルを含めないURL文字列が全て格納される。
置換テキストにおける条件分岐
$URL()、$CONFIRM()、$OHDR()など、チェックするのみで文字列を返さないのに置換テキストで使用可能なコマンドがある。これらを置換テキストで使用すると、コマンドがtrueを返した時のみそれ以下を置換する。falseを返した時はその時点で置換を停止させる。
Replace = "a$CONFIRM(b?)b$CONFIRM(c?)c"
まず「a」を置換する。
"b?"というダイアログ出現。
|
├─「いいえ」を選択するとそこで置換終了。
|  (二回目のダイアログは出ない)
└─「はい」を選択すると「b」を置換する。
  "c?"というダイアログ出現。
  |
  ├─「いいえ」を選択するとそこで置換終了。
  |
  └─「はい」を選択すると「c」を置換する。

注意:置換語句ではコマンド直後の「;」が無視される Edit

+  ...

スイッチ Edit

$STOP() Edit

使用可能な場所 : URL Match を除く検索表現、置換テキスト
引数は不要

$STOP()を使用すると、そのフィルター(cfgファイル全体ではない)が、その通信で、二度と使用されなくなる。高速化・誤爆の回避に使用する。

置換後ストップ、マッチしなければストップのように使う。
置換部分に入れる場合で、置換テキストにおける条件分岐が存在しない場合、入れ忘れないように、最初に入れておいた方が良い。

$STOP(all)、$STOP(*) の様にして、全てのフィルタを使用しないようにするなどという事は出来ない。

$FILTER( boolean ) Edit

使用可能な場所 : HTTP-Header の検索表現・置換テキスト
booleanは、true か false のどちらか

Webページフィルタを実行するかしないかのスイッチ
スイッチはその接続でのみ有効

※4.5の場合、$FILTER(true) を使用しても、Webページフィルタが有効にならない事がある → 各バージョンの違い#v4-5june6-bug

\k Edit

使用可能な場所 : 置換テキスト
現在の接続を切断する。

HTTP-Header で使用された場合、./html/killed.html の内容(デフォルトは空白ページ)に書き換えられる。
また画像の場合 ./html/killed.gif (デフォルトは小さい透過画像)に置換される。
どちらも、Location: で変更されるのではなく、透過的に置換される。

空のデータに置換したい場合は以下のような方法もある。

Patterns で使用された場合、\k が出た所までブラウザに送信され、残りは送信されない。また、接続も切断されるので、通信の節約にもなる。

リスト Edit

$LST( list_name ) Edit

$ADDLST( list_name, value ) Edit

使用可能な場所 : 検索表現・置換テキスト
list_nameは直接記述する必要がある($SET(0=listname)$ADDLST(\0, value) というのは期待通りに動作しない)
valueは置換テキスト扱い

list_name が Block List に登録されている場合、そのリストに value + \r\n を追記する。
登録されていない場合メモリ上のリストに value が追記される。これは再起動すると消滅する。

置換テキストにおける条件分岐はなく、常に true を返す。

$ADDLSTBOX( list_name, [dialog_title,] value ) Edit

確認、確認選択、報告系 Edit

$ADDLSTBOX()も、確認・報告系として使える

$ALERT( text ) Edit

$ASK( allow_list, deny_list, prompt, text[, alt_match] ) Edit

$CONFIRM( text ) Edit

$LOG( text ) Edit

使用可能な場所 : 検索表現・置換テキスト
textは置換テキスト扱い

textがログウインドウに表示される。
text中の\t\r\nは無視される \xは使用可能

頭の一文字は特別で、文字の色として扱われる。
例えば、$LOG(Rtext) で、 text と表示される。
B =  Blue  
C =  Cyan  実際はaqua
G =  Green  実際はlime  HTTPヘッダ(out)情報と、POSTデータサイズ情報の色
R =  Red  
V =  Violet  実際はfuchsia  マッチしたHTMLフィルタ情報の色
Y =  Yellow   HTTPヘッダ(in)情報の色
w =  gray  実際は#b4b4b4  ポストされたデータ情報と、その他の情報の色
これ以外の文字の場合、白文字になる  ローカルファイルのリクエスト情報と、$JUMP,$RDIRの色
※大文字小文字を区別する

また、4.5では、頭に「!」を置くと、ログウインドウが強制的に表示される。
例:$LOG(!Rtext)

変換 Edit

$ESC( any text ) Edit

使用可能な場所 : 置換テキスト
any textは置換テキスト扱い

any text を1バイトごとに%xx(xxは16進数2桁)に変換する。 ただし、以下の文字は除外されそのまま返される。

* + - . / : @ _ 0-9 A-Z a-z 0x00

1バイトごとの検査であるので、例えば Shift_JIS における ( 0x83 0x6B ) は %83k を返す。

$UESC( any text ) Edit

使用可能な場所 : 置換テキスト
any textは置換テキスト扱い

any text のうち、%xx(xxは16進数2桁)を元の文字に変換する。 対象となるのは%21-%7Eであり、それ以外の文字はそのまま返される。 完全には$ESC()の逆関数になっていない。

$WESC( any text ) Edit

使用可能な場所 : 置換テキスト
any textは置換テキスト扱い

any text のうち、以下の文字の直前に \ ( 0x5C ) を付加して返す。

"(0x22) &(0x26) '(0x27) ((0x28) )(0x29) *(0x2A)
+(0x2B) ?(0x3F) [(0x5B) \(0x5C) ](0x5D) |(0x7C)

1バイトごとの検査であるので、例えば Shift_JIS における ゼゾ ( 0x83 0x5B 0x83 0x5D ) は ソ[ソ] ( 0x83 0x5C 0x5B 0x83 0x5C 0x5D ) を返す。

これを利用したのが以下のようなフィルタ。

[Patterns]
Name = "Shift_JIS dameji escaper (test only)"
Active = FALSE
Limit = 20000
Match = "\1"
Replace = "$WESC(\1)"

検索表現や置換テキストにおいて日本語を使いたい場合に、 このフィルタのTESTモードでテストをすれば良い。 Shift_JISだと2バイト目が [ , \ , ] , | ( 0x5B , 0x5C , 0x5D , 0x7C ) である場合があり、それが原因でフィルタが動作しないことがあるがそれを防ぐ事が出来る。 ただし対象はShift_JISのみであり、フィルタエディタ部分を日本語使用可能にしている必要がある。

マッチ用 Edit

$AV( match ) Edit

使用可能な場所 : 検索表現
matchは検索表現扱い

HTMLタグの属性値(Attribute's Value)にマッチするように作られたコマンド。

$AV(*) という表現は "*'|\w に等しい。つまり、

にマッチする。ここまでは$AVQ()と共通である。

($AV(\1))\2 という表現で、\1にはクォートを含まない属性値、\2にはクォートを含む属性値が格納される。ただし、属性値の囲みが " なのか ' なのかもしくは何も無いのかを判別するのは困難であり、その必要がある場合は$AVQ()を使うと良い。

$AV()、$AVQ()共に属性値内の\によるエスケープを考慮するので非常に使い勝手は良いが、どちらのコマンドも属性値に日本語(JIS や Shift_JIS の文字)が含まれる場合に誤マッチを引き起こす事があるので注意が必要である。

Bounds = "<img\s*>"
Match = "*\salt=$AV(\1)*"

このような表現において\1にはalt属性の値が格納されるわけであるが、もし

<img alt="機能" src="aaa.jpg">

このような(Shift_JISの)文字列が与えられた場合、\1に格納されるのは「機能" src=」である。「能」の2バイト目が \ (0x5C) に等しいため、日本語を理解できないproxomitronには

<img alt="□□□\" src="aaa.jpg">

このように見えてしまうからである。

解決策は時と場合により、この場合はalt値内にクォートの入れ子がありえないと見切りをつければ以下のような書き換えで対応できる。

Bounds = "<img\s*>"
Match = "*\salt=(\"\1\"|'\1'|(\w)\1)*"

$AV()、$AVQ() は前方一致ではないため、属性値は指定したパターン( $AV(match) における match )により 末尾の文字まで全て消費(マッチ)する必要がある。 もし属性値の末尾部分が消費されず残ってしまった場合、不一致として評価される。

パターン → 検索対象
結果。
$AV(*) → src='123'
* が全てを消費するので、この例に限らず必ずマッチする。
$AV(abc) → src='abcxyz'
xyz が残るのでマッチしない。
$AV(abc&\0) → src='abcxyz'
\0 が全てを消費するのでマッチする。

パターンの末尾部分がグループで候補が複数の場合は、 属性値を全て消費してくれないケースが生じるので注意が必要である。

$AV(*.jp(e|eg)) → src='foo.jpe'
マッチする。
$AV(*.jp(e|eg)) → src='foo.jpeg'
マッチしない。(e|eg) の前部分が foo.jpeg の e を消費した時点で満足(「ごちそうさま」)してしまう。するとこの段階で *.jp(e|eg) というパターン全体の評価が終了し、その結果属性値の g が残ってしまうため。
$AV(*.jp(eg|e)) → src='foo.jpeg'
マッチする。長い候補を先に書くことで貪欲に消費させることが出来る。
$AV(*.jp(e|eg)(^?)) → src='foo.jpeg'
マッチする。(e|eg) の前部分が e を消費し、次の (^?) では g が残っているのでマッチしない。そこでバックトラックして (e|eg) の後部分が eg を消費し、 今度は文字が残っていないので (^?) が成立する。

JavaScript内に記述されたHTMLタグ(文字列リテラル中で " がエスケープされたもの)にマッチさせる場合は以下のバグに注意。

属性値が \" で囲まれている場合に起きるバグ。

テキスト: <test a=\"1\" b=2>
Match欄 : a=$AV(\0)   → 「\"1\"」がマッチ。
Match欄 : a=$AV(\0["])  → 「合致なし」
 

このように、$AV()内の最後に ["] や \" を置くとマッチしなくなる。 $AVQ()でも同じ。( 4.5June338で確認 )

$AV(*) は以下の表現と同じ文字列にマッチする。

(["'])\9
(\\\\|\\$TST(\9)|?)++
$TST(\9)(^[!-=?-%FF])
|
[!-=?-%FF]+{1,*}

$AVQ( match ) Edit

使用可能な場所 : 検索表現
matchは検索表現扱い

$AVとほとんど同様のコマンドなのでそちらを参照のこと。

唯一の違いとして、($AVQ(\1))\2 という表現では\1、\2共にクォートを含む属性値が格納される。よって、

$AVQ((\"|'|)*)

という表現をベースに属性値の囲みによって処理を振り分けられる。

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

start match、inner matchでは {x,y} の形での繰り返し回数指定が使えない。
{x} の形は動く。 end matchではどちらも動く。

例、テキスト "abc" でテストした場合。
$NEST(a,b,c)     → マッチ
$NEST(a+{1},b,c)   → マッチ
$NEST(a+{1,1},b,c)  → 『合致なし』
$NEST(a+{1,*},b,c)  → 『合致なし』
$NEST(a,b+{1},c)   → マッチ
$NEST(a,b+{1,*},c)  → 『合致なし』
$NEST(a,b,c+{1,*})  → マッチ

start match、end matchは外側と内側の両方にマッチするものでなければならないが、外側と内側で属性等が異なる場合で、 その属性等も検索表現に含めたい時は、次項の$INEST()か、肯定先読みを使う。

例:
<div id="ad"><div>~</div></div>
に外側のid属性を指定してマッチさせたい場合

(^(^<div id=$AV(ad)))$NEST(<div,</div>)

※ 先読みで属性のマッチを行い、$NEST()のstart matchは最低限にすることで、内外の属性の差異に関わらず入れ子を正しく認識できる。

$NEST()はクォートも考えて処理している
http://hibari.2ch.net/test/read.cgi/software/1287997298/852-854n
特別な処理が行われるのは、" 0x22 と ' 0x27 で、` 0x60 は処理されない。

検証フィルタ
[Patterns]
Name = "TEST: $NEST(<div>,</div>)  text=<div>'</div>'"
Active = FALSE
Limit = 256
Match = "$NEST(<div>,</div>)"
Replace = "-"
検索対象処理後
1<div>a</div>a-a
2<div>"</div>"<div>"</div>"
3<div>'</div>'<div>'</div>'
4<div>`</div>`-`
5<div>''</div>'-'
6<div>'''</div>'<div>'''</div>'
7<div>I'm Proxomitron</div>'<div>I'm Proxomitron</div>'
8<div>"I'm Proxomitron"</div>'-'
$NEST()は本当に速いのか
http://vird2002.s8.xrea.com/proxomitron/matching_command/m-cmd_nest.html
http://pc11.2ch.net/test/read.cgi/software/1196532172/563n
>$NEST(<a\s,</a>) は <a\s*</a> よりも高速に動作する、という事です。
これ、\sの直後に*が来てるから後者が遅いだけじゃないか?

$NEST(<a(\s*|)>,</a>) と <a(\s*|)>*</a>
検索対象=「<a hoge>url</a>aaaaaaaaaaaaaaaaaaaaaaaaa」を100個並べた物
だと逆転する。どっちにしろ誤差の範囲内だが。

$INEST( start_match, [inner_match,] end_match) Edit

end match は「$INEST()コマンドの後ろに続く検索表現」に前方一致でマッチする検索表現でなければ機能せず、 『合致なし』となる。
※ ここでは$INEST()の動作条件のみに焦点を絞って書いてます。$INEST()の正しい使い方は日本語訳ヘルプをご覧下さい。

× <table>$INEST(<a\s*>,</a>)</table>
  → "</a>" という検索表現は "</table>" にはマッチしない。

○ <table>$INEST(<tab>,</tab*>)</table>
 → "</tab*>" という検索表現は "</table>" にマッチする。

移動 Edit

$JUMP( url ) Edit

使用可能な場所 : [HTTP Headers]の検索表現・置換テキスト(URL、Match、Replace全て)
url は置換テキスト扱い。http://host/path/の様な完全な物か、/から始まる相対パス以外は使用出来ない(../~等の相対パスは\uに置き換えられてしまう)。

Proxomitronに接続して来たものに、Location:ヘッダを返して、指定したURLに移動させようとする。
(通常一般的なブラウザは、Location:ヘッダを受け取った場合、自動でそのURLに新しく接続する=別の接続になる)

↓実際に返すヘッダ
HTTP/1.1 302 Redirect
Content-Length: 0
Connection: close
Location: url

※Inで使用し、元々のサイトが発見出来なかった場合は、エラー画面が出て、移動しない。
http://localhost/ だと、Outでのみ有効になる。
hostsファイルを弄って、localhostt等に変更してみると、Inも有効。
また、localhost:80の様にポートを付けるとInも有効になることから、localhost/~の場合だけInが無効になる様子。

IE6の場合、$JUMP(file://C:/a.txt) の様に file:// を使うとローカルのファイルを直接参照可能(この場合、ブラウザがキャッシュしない為高速)

https: + out で使用すると、正常に移動しないことがあるので注意

$RDIR( url ) Edit

使用可能な場所 : [HTTP Headers]の検索表現・置換テキスト(URL、Match、Replace全て)
url は置換テキスト扱い。http://host/path/の様な完全な物以外は使用出来ない(/から始まる相対パスはエラーになり、../~等の相対パスは\uに置き換えられてしまう)

指定したURLに移動する。 ReDIRect
$RDIR()で移動後、再度$RDIR()を使用して他のアドレスに移動しようとしても、それは処理されない。

※Inで使用し、元々のサイトが発見出来なかった場合は、エラー画面が出て、移動しない。
http://localhost/ だと、Outでのみ有効になる。
hostsファイルを弄って、localhostt等に変更してみると、Inも有効。
また、localhost:80の様にポートを付けるとInも有効になることから、localhost/~の場合だけInが無効になる様子。

$RDIR(file://C:/a.txt) の様に file:// を使ってもローカルのファイルは参照不能 URLコマンドのfile//を使うしかない(この場合ブラウザにキャッシュされる)

https: + out で使用すると、正常に移動しないことがあるので注意

未検証事項

+  ...

Proxy Edit

$SETPROXY( proxy_address ) Edit

$USEPROXY( boolean ) Edit

変数 Edit

$SET( 変数名 = value ) Edit

変数名にはローカル変数の 0~9、# が使用可能。 更に 4.5beta 以上ではグローバル変数も使用可能。

検証求む:フィルターはマッチしているのに代入されないことがあるらしい。

[バグ] 最長一致状態のローカル変数の直後に、同じ変数を$SET()で使用すると、ローカル変数の値が 0xHH になってしまう。

[Patterns]
Name = "TEST1: \1$SET(1=hoge)  text=abc"
Limit = 256
Match = "\1$SET(1=hoge)"
Replace = "[$ESC(\1)]"

Name = "TEST2: \1b$SET(1=hoge)  text=abc"
Limit = 256
Match = "\1b$SET(1=hoge)"
Replace = "[$ESC(\1)]"

[結果]
TEST1
4.5may以上: [%0A]
4.3, 4.4: [abc]

TEST2
4.5may以上: [hoge]c
4.3, 4.4: [a]c

ローカル変数にセットされるおかしな値は、$SETでセットした文字列の長さ(と内容)によって決まる
1Byteなら 0x07
2Byteなら 0x08
3Byteなら 0x09
4Byteなら 0x0A
・・・
35Byteなら 0x29 = )
36Byteなら 0x2A = *
37Byteなら 0x2B = +
・・・
120Byteなら 0x7E = ~
121Byteなら 0x7F
122Byteなら 0x80
・・・
240Byteなら 0xF6
248Byteなら 0xFE
249Byteなら 0xFF
250Byteで空(0x00ではない)
251Byteで 0x01 0x01 0xFB (3Byte)
252Byteで 0x02 0x01 0xFC
253Byteで 0x03 0x01 0xFD
・・・
256Byteで 0x06 0x01 (2Byte)
257Byteで 0x07 0x01 0x01 0x01 の後にセットしたもの全て (4+257Byte)
258Byteで 0x08 0x01 0x02 0x01 の後にセットしたもの全て
259Byteで 0x09 0x01 0x03 0x01 の後にセットしたもの全て
・・・

参考:ASCIIコード表 http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html

$GET( 変数名 ) Edit

4.5beta から追加された機能

$TST( 変数名 [= match] ) Edit

4.5beta から追加された機能

Match で取り込んだ変数を同じ Match で使いたいなどという場合、以下のような表現になる。(重複単語の削除)
Match = "\s(\w+{1,*})\0\s$TST(\0)(^(^\s))"
Replace = "\0"

(バグ) 『 $SET(\0=abc)$TST(\0) 』などの「$SET() + $TST() + ローカル変数」の組合わせは機能せず [合致なし] になる。

 テスト用文字列 = "hogehoge"

 ・ "$SET + $TST + ローカル変数"
       $SET(\0=hogehoge)$TST(\0) → "[合致なし]"

 ・ "$SET + $TST + グローバル変数"
       $SET(N=hogehoge)$TST(N)  → マッチ

 ・ "()\0 + $TST + ローカル変数"
       (hoge)\0$TST(\0)      → マッチ

 ・ "()\0 + $SET + $TST + ローカル変数"
     (hoge)\0$SET(\0=hoge)$TST(\0) → "[合致なし]"

 ・ "$SET + ()\0 + $TST + ローカル変数"
     $SET(\0=hoge)(hoge)\0$TST(\0) → マッチ
     ※ (hoge)\0 で代入し直しているのでマッチする。

ヘッダ値参照 Edit

$URL( matching value ) Edit

使用可能な場所 : 検索表現・置換テキスト
matching valueは検索表現扱い。前方一致。

プロトコルを含んだURLのチェック。

$URL(yahoo.co.jp/)     × マッチする事はありえない
$URL(http://yahoo.co.jp/) 〇
$URL([^/]+//yahoo.co.jp/) 〇

$OHDR( header-name:matching ) Edit

使用可能な場所 : Incoming Header FilterとPatternsの検索表現・置換テキスト
header-name はリクエストヘッダ名完全一致 (大文字小文字は問わず)。コマンド等使用不可
matching は検索表現扱い。前方一致。

リクエストヘッダの値のチェック。

Webページフィルタで利用する場合、ヘッダフィルタで置換された後のヘッダが出力される。 ヘッダフィルタでどうなるかは未検証。 $IHDR()も同じ。

$IHDR( header-name:matching ) Edit

使用可能な場所 : Patternsの検索表現・置換テキスト
header-name はレスポンスヘッダ名完全一致 (大文字小文字は問わず)。コマンド等使用不可
matching は検索表現扱い。前方一致。

レスポンスヘッダの値のチェック。

OUT中に$IHDR()を使用した場合、当然空 とも限らない
out 時に $IHDR() を使用する = $OHDR() と間違えたんだろうということで、Proxomitron が $OHDR() として処理する $OHDR() でも空だった場合は、空を返す (4.3, 4.4, 4.5m, 4.5j, 4.5j338, 4.5j+6 で確認)
以下例 http://prx.dip.jp/test/filtertest/nph-test.cgi で試してください

[HTTP headers]
In = FALSE
Out = TRUE
Key = "Content-Type: test $ALERT($[OI]HDR(Content-Type: )) 1/2 (out)"
URL = "prx.dip.jp/test/filtertest/"
Replace = "test"

In = TRUE
Out = TRUE
Key = "URL: test $ALERT($[OI]HDR(Content-Type: )) 2/2 (both)"
URL = "prx.dip.jp/test/filtertest/"
Match = "($OHDR(Content-Type: \0)|)($IHDR(Content-Type: \1)|)"
Replace = "$ALERT(out = \0\r\nin = \1)"
out時
out = test
in = test

in時
out = test
in = text/html; charset=Shift_JIS

ヘッダフィルタの「URL のマッチ (URL)」は、リクエスト(out)時に一度だけ処理される。
そのため、$IHDR() を、ヘッダフィルタの「URL のマッチ (URL)」で使った場合、値が取得できないか、$OHDR() の値になる
以下例 test2, test3 は動作するが、test1 は動作しない(http://prx.dip.jp/ で試してください)

[HTTP headers]
In = TRUE
Out = TRUE
Key = "URL: test1 $IHDR(Server: \0)"
URL = "prx.dip.jp/(^?)$IHDR(Server: (^Proxomitron)\0)$ALERT(test1 Server: \0)"

In = TRUE
Out = TRUE
Key = "URL: test2 $IHDR(Server: \0)"
Match = "http://prx.dip.jp/(^?)$IHDR(Server: (^Proxomitron)\0)$ALERT(test2 Server: \0)"

[Patterns]
Name = "test3 $IHDR(Server: \0)"
Active = TRUE
URL = "prx.dip.jp/(^?)$IHDR(Server: (^Proxomitron)\0)$ALERT(test3 Server: \0)"
Limit = 256
Match = "<start>"

$RESP( matching ) Edit

使用可能な場所 : Incoming Header FilterとPatternsの検索表現・置換テキスト
matching は検索表現扱い。前方一致。

ステータスコード(「200 OK」「404 Not Found」など)のチェック。

$TYPE( code ) Edit

使用可能な場所 : 検索表現
codehtm / css / js / vbs / oth のいずれかの文字に限られる。(大文字小文字は問わず)

Content-Typeのチェック。$IHDR(Content-Type:)で代用することも可能。

htm
ウェブページ。$IHDR(Content-Type: (text/html | multipart/x-mixed-replace)*)に等しい。
css
スタイルシート。$IHDR(Content-Type: text/css*)に等しい。
js
JavaScript。$IHDR(Content-Type: (text/javascript | application/x-javascript)*)に等しい。
application/javascript, application/json はこれに一致しない。
vbs
VBScript。$IHDR(Content-Type: text/vbscript*)に等しい。
oth
上記に該当しない Content-Type 全て。

なお、通常は $TYPE(oth) に該当する Content-Type に対してはWebページフィルタが適用されないため、 そのままWebページフィルタで $TYPE(oth) を記述しても意味が無い。 ヘッダフィルタで $FILTER(true) を使っていれば有効に働く。

バージョンによりヘッダの値のマッチに差異がある。例: $TYPE(css)

Edit

$KEYCHK( keycode list ) Edit

使用可能な場所 : 検索表現・置換テキスト
keycode list は[0-9a-z]もしくは「^」で始まる独自のキー名かDuckDuckGo:仮想キーコード。大文字小文字は区別しない。

指定したキーが押されていたかどうかを判定し、押されていたらマッチする。2つ以上のキーを指定することも可能。

0~9、A~Zはそのまま書いてよい。

$KEYCHK(g)  Gキー
$KEYCHK(12) 1キー+2キー (ただしテンキーでは無効)

特別に用意されたキー名。

$KEYCHK(^c)  Ctrlキー
$KEYCHK(^a)  Altキー
$KEYCHK(^s)  Shiftキー
$KEYCHK(^t)  TABキー
$KEYCHK(^f1) F1キー (f2~f12も同様)

その他の特殊キー・記号キー・テンキー・マウスボタン等は10進数の仮想キーコードを用いる。

$KEYCHK(^13)    Enterキー
$KEYCHK(^192)   [@]キー
$KEYCHK(^97)    テンキーの[1]
$KEYCHK(^1^2^4) マウスの左ボタン+右ボタン+中ボタン

仮想キーコードは、一覧表を検索するか以下のようなスクリプトで調べよう。

<script>//IE用
(d=document).onkeydown=d.onmousedown=function(){
d.body.innerHTML+="<br>$KEYCHK(^"+(event.keyCode||event.button)+")";
return false;}
</script>

アドレスバーに以下を入力して実行でもOK

javascript:(d=document).onkeydown=d.onmousedown=function(){d.body.innerHTML+="<br>$KEYCHK(^"+(event.keyCode||event.button)+")";return%20false;};eval()

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

$DTM( text ) Edit

使用可能な場所 : 置換テキスト
textは置換テキスト扱いではなく、変数使用不可

text内の一部の文字を、Proxomitronが動作しているPCの時間に書き換える。
「$DTM(Y/M/D H:m:s)」は、「2006/4/3 23:23:31」の様になる。
$SET(hour=$DTM(H)) の様に、変数に代入すれば$TSTを使用して検索表現にも使用可能

パラメータ2001年02月03日 04時05分06秒 GMT+9(JST) の例説明
Y2001西暦年4桁  Year
M2月1桁  1 から 12  Month
D3日1桁  1 から 31  Day
曜日
wSat英語曜日(3文字の省略文字型)  Mon から Sun  day of the week
※4.5以降のみ
h04時間2桁  01 から 12(AM0時でもPM0時でも12)  hour
※4.3ではAM0時は00、PM0時は12を返す
H04時間2桁  00 から 23  Hour
m05分2桁  00 から 59  minute
s06秒2桁  00 から 59  second
全ての日付/時刻
d2001-2-3西暦年4桁-月1桁-日1桁 = Y-M-D  date
E3/2/2001日1桁/月1桁/西暦年4桁 = D/M/Y  EU
IFri, 02 Feb 2001 19:05:06 GMT英語曜日, 日2桁 英語月 西暦年4桁 時間2桁:分2桁:秒2桁 GMT
※グリニッジ標準時(日本時間はGMTに9時間足したもの)
RFC 822, updated by RFC 1123  Internet Format
T04:05:06時間2桁:分2桁:秒2桁 = H:m:s  Time
U2/3/2001月1桁/日1桁/西暦年4桁 = M/D/Y  US
その他
t858ミリ秒(1/1000秒)  00 から 999  thousand
c23現在の接続番号  1 から 無限?  connection
LogWindowに表示される +++GET 23+++, +++RESP 23+++, +++CLOSE 23+++ の数字部分
どの通信でマッチしたかの判断に使える
aam午前ならamを、午後ならpmを返す  am/pmのa
pam午前ならamを、午後ならpmを返す  am/pmのp

月2桁、日2桁は無い


$FILE( filename ) Edit

使用可能な場所 : 置換テキスト
filenameにはコマンド等使用不可

filenameで指定された任意のローカルファイルを読み込み、その内容を返す。

$FILE(C:\\temp\\aaa.txt) 
$FILE(C:/temp/bbb.css) 
$FILE(html\\ccc.js) 

フォルダの区切りは \\/ を使う必要がある。 ドライブ名を省略するとproxomitron.exeのあるフォルダを表す。 \d や http:// で始まるパスは使えない。日本語を含むパスの場合、2バイト目が \ ( 0x5C ) である文字はエスケープしなければならない。このコマンドは呼ばれるごとにファイルを読みに行く(メモリに蓄積はされない)ので、ファイルの更新はすぐに反映される。

このコマンドを用いてフィルタエディタだけでは実現できない置換が可能となる。 例えばUTF-16LEのページにおいて 0x00 を含む文字列をReplaceしたい場合に、フィルタエディタからは困難である。ところが、Replaceしたい内容をあるテキストファイルにUTF-16LEで保存*1 しておき、

Replace = "$FILE(html\\UTF16LE.txt)"

などとしておけば比較的容易である。


$LOCK() Edit

$UNLOCK() Edit


<start>、<end> Edit

<start>、<end> はメタキャラクタの一種で、Match 欄に単独で記述した場合のみ有効となる。

例えば以下のように他の文字をつけると無効となり、その部分は単なる「<start>」「<end>」という文字のパターンとして解釈される。

また、単独で記述した場合でもテストウィンドウでは無効化される (「マッチさせる語句(Match)」の先頭や末尾ではなく、文中の <start> や <end> というテキストにマッチしてしまう)。

一つのフィルタにつきページの先頭または末尾の1回のみに反応するので、Replace 欄に $STOP() を書く必要はない。

<start> あるいは <end> を使うフィルタが複数あっても Multi = "true" は不要で、普通のフィルタと同じく上から順にマッチしていく。

Bounds と Limit の値は無視される。よって、変数・コマンド・条件分岐等は URL = "~" 内に書く必要がある。

URL = "$URL(\0)($IHDR(Last-Modified:\1)|)"
Match = "<start>"
Replace = "<!-- \0 \1 -->"

ウェブサーバによっては、Ajax や Flash から読み込まれるデータファイルの Content-Type が正しくないことがある (JSON やプレーンテキストなのに Content-Type: text/html を返すなど)。

そのようなデータファイルに <start>、<end> が適用され Replace = "~" が挿入されると、 正しくないデータ形式になってしまうため正常に動作しなくなることがある (普通のWebページフィルタでも誤マッチは起こりうるが、<start> と <end> の場合は常にマッチするため問題となりやすい)。

回避するには以下のような方法がある。

<start> Edit

使用可能な場所 : [Patterns]のMatch
$TYPE(htm) に該当する接続の場合のみ適用される。

ウェブページの先頭に一致する。JavaScript や CSS を埋め込む時などに使用する。

<start>でなんらかの文字列をページ先頭に挿入すると、IE6のDOCTYPEスイッチが無効になるので、回避する場合は以下のように書き換える。

URL = "$TYPE(htm)"
Limit = 256
Match = " (<!DOCTYPE*>|)\0$STOP()"
Replace = "\0<挿入文>"

<start>で大量の文字列をページ先頭に挿入すると、IEの文字コード自動判別が上手く動作しなくなる事がある。それを回避するには例えば以下のように書き換える。

URL = "$TYPE(htm)"
Match = "(^(^<(script|/head|body)))$STOP()"
Replace = "<挿入文>"

<end> Edit

使用可能な場所 : [Patterns]のMatch
$TYPE(htm) に該当する接続の場合のみ適用される。

ウェブページの末尾に一致する。JavaScript や CSS を埋め込む時などに使用する。

他のフィルタが \k で読み込みを中止した場合でも働く。 この場合、置換テキストの出力は \kフィルタ → <end>フィルタ の順となる。


URLコマンド Edit

http://proxomitron.sakura.ne.jp/help/URL_Commands.html

file//
http://\xfile//C|/a.txt
load//
http://\xload//cfg?url
# Amazonにアクセスした時だけ自動でAmazon.cfgに切り替えて特定のフィルタのみ処理する例
([^/]++.|)(images-|)amazon.co(.jp|m)/ $LOG(C$DTM(c): Load Amazon.cfg) $JUMP(http://\xload//Amazon.cfg?\u)
# ※Amazon.cfgからdefault.cfgに自動で戻すようにした場合、AmazonとAmazon以外の混成ページを読み込んだ時におかしなことになり、再起動させないと接続できなくなる
#  また、$RDIRを使うと妙なエラーが出ることがある様子
# ProxomitronやProxydomoを複数異なるポートで待機させておき、ブラウザのアドオン機能などでURL毎に自動的に異なるProxyを使うようにしたほうがいい(勿論URL欄や$URLなどで絞り込めるならそうしたほうがいい)
dbug..
http://\xdbug..file//C|/a.txt
src..
http://\xsrc..file//C|/a.txt
https..
http://\xhttps..file//C|/a.txt
bypass..
http://\xbypass..file//C|/a.txt
bweb..
http://\xbweb..file//C|/a.txt
bin..
http://\xbin..file//C|/a.txt
bout..
http://\xbout..file//C|/a.txt

4.5June+6 からはIE7対策のため、URL コマンドを . だけでも使えるようになっている(例: http://dbug.whois.jp/




*1 UTF-16LEエンコードのテキストファイル作成:通常通り作成したテキストファイルをIEで開き、[ファイル]>[名前をつけて保存]から[Unicode]で保存しなおせばよい。

複製名前変更