これらのキーワードがハイライトされています:文字コード

大文字小文字の区別 Edit

アルファベットの大文字小文字は区別されない(正規表現で言う i フラグが常に指定されている状態)。

[%HH] で指定した場合は区別される。 ただし 4.5June+3 未満のバージョンでは区別されない各バージョンの違い#v4-5june338参照)。

メタキャラクタ Edit

メタキャラクタ = メタ文字 = 特別な意味/効果を持つ特殊な文字 ※それ以外の普通の文字と、エスケープして特別な意味を無くしたメタ文字はリテラル(literal) と呼ばれる。
メタキャラクタ以外の文字は、それ自体とマッチする。 メタキャラクタは、メタキャラクタの直前に \ を置きエスケープする事で、特殊な意味を無効にする事が出来る。

例 * = 全てにマッチ  \* = 文字「*」(0x2a)にマッチ

\  エスケープ文字 Edit

エスケープに使用する(エスケープしたい文字の前に置く)
¥ = \ = 0x5C
※環境や使用フォントによって、0x5Cはバックスラッシュ(\の半角)か、円記号(¥の半角)になる

エスケープするべき文字 Edit

全ての入力欄 でエスケープするべき文字

&|?*+[]()"'\=^$ 半角スペース

[ ] 内でエスケープするべき文字

%-]

[ ] 内の先頭でエスケープするべき文字

#

$SET() 内でエスケープするべき文字

()\

?+ の直後にエスケープするべき文字

{

ブロックリストの行頭でエスケープするべき文字

# ~ 半角スペース 非ASCII文字(パッチあてればエスケープ不要)


※「半角スペース」は \s で代用可能です。
※「"= 半角スペース」はエスケープしなくても大丈夫なことが多いようです。

" "と'にマッチ  /  "*' 特別表現 Edit

"と'にマッチする。\"の様にエスケープすると、"にのみマッチ。 ["]の様に文字クラス化した場合も、"にのみマッチするので注意。

"*'は特別に用意された表現であり、

がマッチする。例えばonclick="*' が以下のどの記述にもマッチする。

onclick="alert('OK!')"
onclick="alert(\"OK!\")"
onclick='alert("OK!")'
onclick='alert(\'OK!\')'

\s  1つ以上の空白文字にマッチ Edit

1つ以上の空白文字にマッチ。空白文字とは次の文字である:

NUL(0x00) , HT(0x09) , LF(0x0A) , CR(0x0D) , SPC(0x20)

文字クラス内では使用できない。「[\s]」は「s」というアルファベットそのものにマッチしてしまうので注意。

スペースがあっても無くても良い場合は \s+ と書くことが出来る。 動作は (半角スペース) と同じだが、編集時にうっかり消してしまうことを防止出来る。

\s は文字列末尾にもマッチする。この場合、"(^?)" と同じ働きをする。

半角スペース  0個以上の空白文字にマッチ Edit

0個以上の空白文字にマッチ。空白文字とは次の文字である:

NUL(0x00) , HT(0x09) , LF(0x0A) , CR(0x0D) , SPC(0x20)

半角スペース一つにのみマッチさせたい場合、「[ ]」の様にする。※[ ]は0x20以外にはマッチしない

=  0個以上の空白文字=0個以上の空白文字にマッチ Edit

0個以上の空白文字=0個以上の空白文字 にマッチする。(HTMLタグを処理する際=の左右のスペースを考えなくて良いので便利)
\=の様にエスケープさせると=にのみマッチする。 [=]の様に文字クラス化した場合も、=にのみマッチする。

\w  空白文字と「>」を含まない0個以上の文字列にマッチ Edit

空白文字と「>」を含まない0個以上の文字列にマッチ。[!-=?-%FF]++ とほぼ同じ。
文字クラス内では使用できない。「[\w]」は「w」というアルファベットそのものにマッチしてしまうので注意。
後ろの検索表現が )、 |、 &、&&、などの場合、後ろを見ないマッチングをする。
⇒ \wabc はマッチするが (\w)abc はマッチしない。

?  任意の一文字(1バイト)にマッチ /./ Edit

任意の一文字(1バイト)にマッチ Perlの正規表現で言う所の「.」

*  空を含む全てにマッチ(最短一致または最長一致) /.*?/ /.*/ Edit

空を含む、全てにマッチ 最左最短一致、非欲張り、控えめ (non-greedy) Perl5の正規表現で言う所の「.*?」 アスタリスク

Match = "(*b)\0"
Replace = "[\0]"
対象 = "abbbbc"
結果 = "[ab][b][b][b]c"

Match = "(*b)\0c"
Replace = "[\0]"
対象 = "abbbbc"
結果 = "[abbbb]"

「?++」と「*」は全く同じではない
*は特別で、最長一致(Perl5の正規表現で言う所の「.*」)になることもある
最長一致になる条件は、検索語の最後に使われている事と思われる

例
Match = "*"
Replace = "-"
対象 = "abc"
結果 = "-"
※もしこれが、最短一致なら、結果は -a-b-c (3回マッチ)になる

& && | で区切った場合もちゃんと最後に置いたと認識される
Match = "abc* & abcde"
Replace = "-"
対象 = "abcdef"
結果 = "-"

※検索語の最後にコマンド($SET() や $URL() など)を置いた場合、最後に置いたと認識されないのか、最短一致のままで動作する

Match = "*$URL(?)"
Replace = "-"
対象 = "abc"
結果 = "-a-b-c" (3回マッチ)

※※しかし、 \0$URL(?) だと最長一致になる。\0-9# でも同じ。\0-9# は検索語の最後にコマンドがあっても最長一致になる。参考:掲示板/1
これは、* の方がおかしな動作をしている(バグ?)といえそうである。

また、どうやら微妙なバグ(仕様?)もある様子
Match = "?*$URL(*)"
Replace = "-"
対象 = "abc"
結果 = "--c" (2回マッチ)
※「?*」の * を \0-9# に置換すると、結果は「-」の1回マッチになる

Match = "??++$URL(*)"
Replace = "-"
対象 = "abc"
結果 = "---" (3回マッチ)

*\0-9# の後に対象を消費しない物(ゼロ幅の否定・肯定文)がある場合は、* は最長一致として動作する様子。
Match = "?*((^(^?))|(^?)|comment)"
Replace = "-"
対象 = "abc"
結果 = "-" (1回マッチ)

Match = "??++((^(^?))|(^?)|comment)"
Replace = "-"
対象 = "abc"
結果 = "---" (3回マッチ)

最左最短で、マッチの開始位置の変更はしてくれないので、

Match = "もな*ぎこ"
Replace = "Zぞぬ"
は
「もなふっさ
もなぎこ」
の2行全てを「Zぞぬ」に置き換えてしまう。

()  グループ化 Edit

グループ化する。 繰り返し表現や、 ^ | & && 等と併用する。 また、変数への取り込みにも使用される。

[]  文字クラス化 Edit

文字クラス(文字のセット)化する。

例
[/.:] / . : のどれか1文字にマッチ
["&*?|] " & * ? | のどれか1文字にマッチ

このようなメタキャラクタはエスケープの必要が無い。

[abd] A , B , D , a , b , d のどれか1文字にマッチ

テストされる文字は一旦小文字に直されるため、大文字小文字の区別無くマッチ

[2-6] 2 , 3 , 4 , 5 , 6 のどれか1文字にマッチ

「-」でASCII順の範囲指定。「-」そのものにマッチさせる時は[%2d]と書くか、[abc-]のように最後に置くか[0\-9]のようにエスケープする。

[c-G] C , D , E , F , G , c , d , e , f , g のどれか1文字にマッチ

c(0x63)~G(0x47) という一見ありえない範囲指定だが、 []の内部も先に小文字に直されるため c(0x63)~g(0x67) に(大文字小文字の区別無く)マッチする。[%63-%47],[c-%47],[%63-G] なども全て同じ表現になる。

[A-z] AからZ、aからz のどれか一文字にマッチ

前記の通り A(0x41)~z(0x7A) ではなく、 a(0x61)~z(0x7A) に(大文字小文字の区別無く)マッチする。よって \(0x5C) , `(0x60) などにはマッチしない。

[^0-9a-z] 0から9、AからZ、aからz 以外の一文字にマッチ

先頭に「^」で否定を表す。「^」そのものにマッチさせる時は[%5e]と書くか先頭以外に置けばよい。

[\]\\] ] , \ のどちらか一文字にマッチ

この2つはエスケープが必須

[\t\n\r] HT(0x09) , LF(0x0A) , CR(0x0D) のどれか一文字にマッチ
[あ] [%82%a0]と同義。

"あ"にはマッチしない。[]はあくまで1バイトの文字列にマッチする。

[アイウエオ] Shift_JISの ア , イ , ウ , エ , オ のどれか一文字にマッチする

Shift_JIS の1バイト片仮名(いわゆる半角カナ)はマッチする。

[0-9#%ff] 0から9、#、0xff のどれか一文字にマッチ
[#%ff0-9] これは SyntaxErrorになる。 理由は下記。

「[#」の様に、文字クラスの最初が # の場合、# の次は半角数字でなければエラーになる。 [#n:m]として処理してしまう為らしい。

例
[#a]  SyntaxError
[\#a] OK(a,# の文字クラス)
[a#]  OK(a,# の文字クラス)
[#1a] OK(※文字クラスではない 00001 等の数字の1に一致 a には一致しない [#n:m]参照)

[%HH] Edit

指定した値の1バイトにマッチする。HH は16進数で 00~ff。

アルファベットの大文字と小文字を区別したい場合や、入力できない文字、マルチバイト文字にマッチさせたい場合に使用する。

4.5June+3 未満では、%41-%5a%61-%7a(A-Za-z)を指定した場合に大文字小文字が区別されずにマッチする。

パターン4.5June+3 未満4.5June+3 以上
[a]A、a にマッチ
[%41]A、a にマッチA にマッチ
[%41%61]A、a にマッチ
[%ff]0xff にマッチ
[%82][%a0]Shift_JISの「あ」にマッチ

文字を [%HH] 形式に変換して表記することを「エンコードする」と言う。
(例) 全角空白をエンコードすると

Shift_JIS[%81][%40]
ISO-2022-JP[%1B][%24][%62][%21][%21][%1B][%28][%42]
EUC-JP[%A1][%A1]
UTF-8[%E3][%80][%80]

Proxomitron の内部構造は本来マルチバイト文字に対応していないため、マルチバイト文字をそのまま記述すると、

といった問題がでる。そこで、マルチバイト文字は [%HH] 形式にエンコードして記述するのがよい。

Shift_JIS には、2バイト目に 0x41~0x7A(ASCII における A-Za-z)を含む文字がある。

例えば Shift_JIS で「萌」(0x96 0x47)にマッチさせたい場合、そのまま「萌」と記述すると Proxomitron は「0x96 という1バイト値+英字の G」というパターンとして解釈してしまう。 アルファベットは常に大文字小文字が同一視されるので、これは「萌」だけでなく 「鉾」(0x96 0x67=g)にもマッチしてしまう。

そこで [%96][%47] と記述することで、[%47] は 0x47 だけにしかマッチせず、「萌」のみ マッチして「鉾」にはマッチしなくなる(ただし 4.5June+3 未満では同一視されるためこの回避策は使えない)。

なお、Shift_JIS では他に以下のような誤爆もあるが、これらは [%HH] 記法でも回避できない。

参考リンク

^ 否定  /  (^) ゼロ幅の否定先読み  /  (^(^))、(^[^]) ゼロ幅の先読み Edit

^ (0x5E) キャレット。大本か、グループ、文字クラスの始まりに置き使用すると、否定を意味する。 大本、グループの始まりに置いた場合、対象を消費しない、ゼロ幅の否定先読みになる。 2回使うと否定の否定で、対象を消費しない、ゼロ幅の肯定先読みになる。

A(^(^(B+)\1))
対象文字列が A、AB、ABBB などの場合にマッチ。
\1には0個以上のBが代入される。Bは消費されない。
\1はこれ以降も (~)\1 や $SET(\1=~) での書き換えが可能。
A(^(^(B+)\1))B という表現の場合、AB、ABB などにマッチし、\1には1つ以上のBが代入される。
以上のことから一番使いやすく便利な代入方法だと思われる。
A((^(^B+)))\1
対象文字列が A、AB、ABBB、AC、ACCC などの場合にマッチ。
\1には空文字が代入される。これにより\1は以後使用不能となり、 $SET(\1=~) や (~)\1 での代入は出来なくなる。 Bの繰り返し部分は消費されない。よって使い道が無いと思われる。
※\1で0x00が出力できるようになるわけではない
※&/&& の後では代入可能
A(^(^B+))\1
対象文字列が A、AB、ABBB、AC、ACCC などの場合にマッチ。
\1には先頭のA以外の文字列が代入され、A以降の文字列も消費される。
\1はこれ以降は (~)\1 での書き換えは出来るが $SET(\1=~) の代入を使うと誤動作し、 Replace欄での出力が途中で止まってしまう。
[バグ] 最長一致状態のローカル変数の直後に、同じ変数を$SET()で使用すると、ローカル変数の値が 0xHH になってしまう参照

A(^(^B+))\1B という表現は対象文字列が ACCCB の場合でもマッチし、\1に CCC が入る。

"+" を取り、A(^(^B))\1 という表現にすると AB、ABCDEF などにマッチ。
\1には先頭のA以外の文字列が代入され、A以降の文字列も消費される。

また、A(^(^B))\1B という表現にすると AB 以外にはマッチしなくなる。
\1には代入が行われない。2つ目のBが消費を行うためだと思われる。

以上のことから (^(^text))\1 という使い方は避けたほうが無難。

|  または Edit

又は。大本か、グループ内で使用する。

&、&& Edit

勿論どれも最初にマッチしなければ、次を検索しない。

例1 対象 = <a href="x">a</a>
<a *>&\1    \1 = <a href="x">a</a>
<a *>&&\1   \1 = <a href="x">

例2 対象 = tttestqqq
test&\0                 \0 = testqqq
test&\0  ByteLimit = 5  \0 = testq
test&&\0                \0 = test

繰り返し表現 Edit

繰り返したい物の直後に付ける。 グループ化した物の後ろに付けると、そのグループが対象になる。

+  0回以上の繰り返し 後ろを見ない /(?>値*)/ Edit

0回以上の繰り返し 最長一致の様だが違う、後ろを全く見ない検索 Perl5の正規表現で言う所の「(?>値*)」

例
Match = "(?+b)\0"
Replace = "[\0]"
対象 = "abbbbc"
結果 = [No Match]
「?+」が全て消費し切ってしまう為こうなる
「?+b」はPerl5で言うと「(?>.*)b」

後ろを全く見ない為、++より高速だが、注意して使ったほうが良い

(検索表現)+ 、(検索表現)++ を使った場合、(検索表現) が最短一致でマッチしない場合はfalseを返す。
⇒ ([^/]+/)+ は (*/)+ と同義。

++  0回以上の繰り返し 最短一致 /*?/ Edit

0回以上の繰り返し 最左最短一致、非欲張り、控えめ (non-greedy) Perl5の正規表現で言う所の「*?」

例
Match = "(?++b)\0"
Replace = "[\0]"
対象 = "abbbbc"
結果
  4.5j, 4.5m, 4.3  [ab][b][b][b]c
  4.4  [ab][b]b[b]c
※4.4はバグが原因でtestではそう表示されるが、実際のマッチでは問題ない様子(4.3、4.5と同じ)

「?++」と「*」は全く同じではない

Match = "?++"
Replace = "-"
対象 = "abc"
結果
  4.5j, 4.5m, 4.4  -a-b-c  マッチ回数3回
  4.3  [No Match]  ※4.3は対象を消費しない場合、マッチしない

マッチの開始位置の変更はしてくれない

[Patterns]
Name = "TEST: text = abcccde  1/4  (bc+)\0"
Match = "(bc+)\0"
Replace = "[\0]"

Name = "TEST: text = abcccde  2/4  (bc++)\0"
Match = "(bc++)\0"
Replace = "[\0]"

Name = "TEST: text = abcccde  3/4  (c+d)\0"
Match = "(c+d)\0"
Replace = "[\0]"

Name = "TEST: text = abcccde  4/4  (c++d)\0"
Match = "(c++d)\0"
Replace = "[\0]"

1/4  a[bccc]de
2/4  a[b]cccde
3/4  ab[cccd]e
4/4  ab[cccd]e

4/4に注目 「最短一致」という言い方をすると、「d」になりそうな気がしてしまうが、マッチの開始位置の変更はしてくれないので、このようになる。
「最短一致」より、「最左最短一致、非欲張り、控えめ」(non-greedy) といった方が誤解がない予感。

勿論Perlでも同じ。参考:最短一致マッチで誤解しやすいこと - a geek

+{n,m} n回以上m回以下マッチ(後ろを見ない) /(?>値{n,m})/  /  +{n} n回マッチ(後ろを見ない) /(?>値{n})/ Edit

n回以上、m回以下マッチ。 {n}はn回ちょうど、{n,*}はn回以上で上限無し。  最長一致の様だが違う、後ろを全く見ない検索 Perl5の正規表現で言う所の「(?>値{n,m}) / (?>値{n})」

例
Match = "?+{2,5}b"
対象 = "aaab"
結果 = [No Match]
「?+{2,5}」が全て消費し切ってしまう為こうなる
「?+{2,5}b」はPerl5で言うと「(?>.{2,5})b」

後ろを全く見ないので、注意して使ったほうが良い。
回数を数える為、繰り返しを表したいだけの場合は、+ を使用した方が速い。

++{n,m} n回以上m回以下マッチ(最短一致) /値{n,m}?/  /  ++{n} n回マッチ(最短一致) /値{n}?/ Edit

n回以上、m回以下マッチ。 {n}はn回ちょうど、{n,*}はn回以上で上限無し。 最短一致 Perl5の正規表現で言う所の「値{n,m}? / 値{n}?」

例
Match = "?++{2,5}b"
Replace = "-"
対象 = "aaab"
結果 = "-"
「?++{2,5}b」はPerl5で言うと「.{2,5}?b」

Match = "?++{2,5}"
Replace = "-"
対象 = "aabbc"
結果 = "--c"
最短一致なのでこうなる Perl5でも同じ

[#n:m], [#n-m] nからmまでの大きさの数にマッチ  /  [#n] 数nにマッチ Edit

数として処理する。 nからmまでの大きさの数にマッチ。nのみの場合、その数にマッチ。 「:」ではなく「-」でも可(古いバージョンはマイナスのみだったような気もする)。 n, m は半角数字、マイナスでも良い。*(アスタリスク)の場合、無限大になる。 絶対値ではなく、値が、[#小:大]である必要がある。  [#n:m]の直後に数字は絶対に来ない。 .(ドット、小数点)、,(カンマ、桁の区切り)は認識しない。また、.(ドット)、,(カンマ)等を無視するようにする事は出来ない。

例1 [#249:375] の場合
000000325    全てにマッチ
0000003250   後ろの250にマッチ
0000032500   マッチしない
000000325.0  .0を除きマッチ
 
例2
[#249:375]    O
[#375:249]    X
[#-375:249]   O
[#249:-375]   X
[#-375:-249]  O
[#-249:-375]  X

また、HTMLタグの値に使用される事を想定されているらしく、右か左に「"」「'」があると、それにもマッチする。
例) 「<img width=[#500:600]>」に <img width="510"> がマッチする。
\"[#100:200]\"のようにしても、""100""、"'100'"、""100'"等にマッチする。

これに繰り返し表現を付けると…
「[#249:375]+」 区切りが半角スペース、タブ、改行・・・であれば連続でマッチ そうでない場合+無しと同じ

 
バグ
[Patterns]
Name = "[#n:m] test"
Limit = 256
Match = "[0-9]+{2}&&[#20:79]&&\0"
Replace = "[$UESC(%\0)]"

テスト用文字列 = "4040"
結果 = "40[@]"
※ByteLimit = 2 を指定しても同じ結果になる

[#n:m] は && や Bounds でマッチする範囲を固定しても、その枠からはみ出て処理するためなのかマッチしない様子
※Match の &&[#20:79] を消すと、結果は [@][@] になる
4.3, 4.4, 4.5May, 4.5June, 4.5June338, 4.5June+6 で確認

ローカル変数 / ローカル配列 Edit

ローカル=そのフィルタ(cfgファイル全体ではない)のみで使用可能

マッチと出力で使用可能 Edit

\0, \1, \2, \3, \4, \5, \6, \7, \8, \9 Edit

アスタリスクと同じで全てにマッチするが、マッチした物を自身に格納する。
格納した値は Replace 等で使用可能。

グループ化した物の後ろに付けると、そのグループにマッチした物をその変数に取り込む。

取り込み処理のみ行う場所
Match, ...
出力処理のみ行う場所
Replace, ...

Match で取り込んだ変数を同じ Match で使いたいなどという場合、$TST()を使用することになる。

URL欄で \0-9# へ代入しても、Bounds、Match、Replaceで参照すると、\0-9# は空になっている。
但し、Match欄が <start> か <end> の場合は、\0-9# は空にならない。

「\0$ALERT(\0)」は必ず空になってしまう。これは、\0 が 1バイトマッチする度に後ろを見ている = \0 が最短の0バイト(空)にマッチするかを調べた次の瞬間に $ALERT() が実行され、検索が終了してしまう為である。
「\0 & $ALERT(\0)」か「\0 && $ALERT(\0)」か「(?+)\0$ALERT(\0)」の様にすれば問題ない。
※「$SET(0=hoge)$ALERT(\0)」や「\0e$ALERT(\0)」の場合 & && は不要

\# Edit

\0-9と同じだが、連続して格納可能。Matchで\#を使い格納した値は、Replaceで\#を使うことにより一つずつ取り出して出力することが出来る。先に格納したものから取り出されるので、FIFO(First In First Out)、つまりキューである。Replaceに書かれた\#で取り出された値は、キューから取り除かれる。


\#には100回まで追加する事が出来る。
100回以降は追加されているようでされていない。(そこでマッチが止まったりはしない)

100回以降の\#への代入は、最後(100個目)の\#に代入される。

対象 = AAA...ABCDEFGHIJKLMN   ※「AAA...A」はAが98個並んだ物
Match = ((?)\#)+
\@ = AAA...ABN


$SET()で\#に代入された\0-9は、代入された時の\0-9の値ではなく、展開(出力)時の\0-9の値になる。

Name = "$SET() TEST 1/3"
Limit = 256
Match = "( (?)\0 $SET(#=\0) $ALERT(\@) )+{1,3}$STOP()"
Replace = "[\@]"

Name = "$SET() TEST 2/3"
Limit = 256
Match = "( (?)\0 & $SET(#=\0) $ALERT(\@) )+{1,3}$STOP()"
Replace = "[\@]"

Name = "$SET() TEST 3/3"
Limit = 256
Match = "( (?)\0 && $SET(#=\0) ? $ALERT(\@) )+{1,3}$STOP()"
Replace = "[\@]"

対象は全て "abc"
結果は全て "[ccc]" ($ALERT(\@)を消しても同じになる)
アラートも全て、「a」、「bb」、「ccc」の3回 (4.4以下だとTEST 1/3のみ「」「aa」「bbb」となる)

この事から、\# に \0-9 を代入した場合、その時の\0-9の値が\#に入るわけではなく、展開時にその\0-9に置き換える為の特別なフラグが\#に入ると思われる。
そして、\#/\@展開時にそのフラグが含まれていた場合、展開したその時の\0-9に置き換えられると思われる。
また、「$SET()で\0-9に代入された\#@は、代入された時の\#@の値ではなく、展開(出力)時の\#@の値になる」でもある。


Bounds か & か && と \# を組み合わせて使用すると、場合によってはバグが発生する(testでも実際のマッチでも発生する)

例
[Patterns]
Name = "TEST: Bounds + \#  <?-?>"
Bounds = "<[^>]+>"
Limit = 256
Match = "<\#-\#>"
Replace = "[\#] [\#] [\#] [\#] [\#] [\@]"

検索対象 =
<a/b>
<A-B>

結果 =
<a/b>
[] [A] [B] [] [] []
※最初の\#にゴミが入っている

検索対象2 =
<A-B>
<a/b>
<c/d>
<e/f>
<C-D>

結果2 =
[A] [B] [] [] [] []
<a/b>
<c/d>
<e/f>
[A] [B] [] [C] [D] []
※<a/b>でAが残り、<c/d>でBが残り、<e/f>で空が残る
※4.4, 4.3では、[A] [C] [D] [] [] []になる

&、&&でも同じ結果になる
[Patterns]
Name = "TEST: & + \#  <?-?>"
Limit = 5
Match = "<[^>]+>&<\#-\#>"
Replace = "[\#] [\#] [\#] [\#] [\#] [\@]"

Name = "TEST: && + \#  <?-?>"
Limit = 256
Match = "<[^>]+>&&<\#-\#>"
Replace = "[\#] [\#] [\#] [\#] [\#] [\@]"

どうも、Boundsでマッチして、Matchでも途中までマッチし、その間で\#がそのまま使用された場合、 次に検索した時には空になっているはずの最初の\#が残ってしまう様子。

幾つかの対策があります ※&/&&の場合、Boundsを&/&&の左側、Matchを&/&&の右側に置き換えてください

  1. Boundsで「$SET(0=bug fix)」の様に\0-9に何か(空以外)を代入する
  2. Matchで最初に使用される\#を()で囲む(「<\#-\#>」→「<(\#)-\#>」)
  3. Matchで最初に使用される\#をグループの直後に置く(「<\#-\#>」→「<(?)\#-\#>」)

出力のみ Edit

\@ Edit

\#に格納された物を全て結合して出力する。それぞれの値は直接結合される。一度出力するとキューは空になり、以後\#や\@を使っても何も出力されない。

グローバル変数 Edit

全フィルタ間で変数のやり取りが可能

4.5以降のみ使用可能
コマンド一覧 の $SET()、$GET()、$TST()参照

定数 Edit

\t  タブ 0x09 Edit

タブ 0x09

\r  リターン=キャリッジリターン(CR) 行頭復帰 0x0d Edit

リターン=キャリッジリターン(CR) 行頭復帰 0x0d Macの改行コード

\n  ニューライン=ラインフィード(LF) 改行 0x0a Edit

ニューライン=ラインフィード(LF) 改行 0x0a UNIXの改行コード (Windowsの改行コードはCRLF)

※testで改行を出力するには\r\nとする必要がある

通信毎に変わるかも知れない物 Edit

https: + out では \u, \h, \p, \q, \a が正しい値を返さないことがあるので注意

\h  現在のURLのホスト部分 Edit

host
現在のURLのホスト部分 ※ポートは常に含まないので、$URL() で取得した方が良い。

使われる場所によって表される値が変化するので注意。 置換テキストで使われたりIPアドレスタイプのドメインならホスト部分全てを表すが、 検索表現で使われた場合は
gTLD(www.google.com , e-words.jp等)ならセカンドレベルまで、
ccTLD(yahoo.co.jp , kantei.go.jp等)ならサードレベルまで、
を含んだ特別な検索表現になる。

www.google.com →
(([^%00-%20"'/:>\\])++.|)google.com(^[^%00-%20"'/:>\\])
yahoo.co.jp →
(([^%00-%20"'/:>\\])++.|)yahoo.co.jp(^[^%00-%20"'/:>\\])
例
url:http://www.google.com/
Match = "\h"

〇
http://[google.com]/
http://[image.google.com]:81/
"[www.yahoo.com+www.google.com]"
[例えばwww.google.com]/で検索

×
http://anothergoogle.com/
http://google.comic.com/
http://google.com@
例えばgoogle.com/で検索
例えばwww.google.comで検索

この挙動が問題となるのは、「Kill off-site Images」のようなフィルタであろう。 例えば、www.2ch.netにおいて「count.2ch.net」「image.2ch.net」をも別ホスト扱いしたい場合であるが、 これは$TST()を使うと上手くいく。

Bounds = "<img\s*>"
Match = "*\ssrc=$AV(https+://(^\h)*)*"
↓
Bounds = "<img\s*>$URL(https+//\1[:/])"
Match = "*\ssrc=$AV(https+://(^$TST(\1))*)*"

※ Webフィルタの検索欄でマッチングに \h を使うと上記とは異なるマッチングをするので注意。

geocities.co.jp のページにいるときに

Match = "\h"

というマッチングをさせると "co.jp" という文字列にまでマッチしてしまう。 つまり ccTLD には対応していない。 "www.yahoo.co.jp" などの文字列にもマッチしてしまうので、 Webフィルタのマッチングには使わないほうが良いだろう。

< 検索欄での2バイト文字への誤爆を避ける方法 >

(\h&&[a-z0-9_.-]+)

のように \h の中をテストをする。

ただし \h の直前に "2バイト目が [a-z0-9_.-] な2バイト文字" があると誤爆する。

\p  現在のURLのパス部分 Edit

path
現在のURLのパス部分

\q  現在のURLの?含むそれ以降全て Edit

? + query string + (# + anchor text|)
現在のURLの?含むそれ以降全て

通常、http://host/a/b/c/index.php?dd#ee の場合、クエリーストリングは「dd」のみだが、\q の場合「?dd#ee」となる。
※IE等のブラウザは通常アンカーテキストをリクエストとして送信しない。

\a  現在のURLの#含むそれ以降全て Edit

# + anchor text
現在のURLの#含むそれ以降全て
※クエリーストリングが有った場合、それ以降を全て\qに持って行かれる為、リクエストにアンカーテキストが含まれていても、\aは空になる。

ちなみに、Proxomitronでは、アンカーテキスト=URLの#以降のこと だが、
他のサイトでは、アンカーテキスト=「<a href="URL">愛生会</a>」の「愛生会」の部分 と言われていることが多い。
どっちが正しいのかは不明
(JavaScriptではURLの#以降はhashと呼ばれ、RFCではfragmentと呼ばれる様子)

\u  現在のURL Edit

URL
現在のURL(但しリクエストされた物そのままではない) [HTTP headers]、[Patterns]、検索、置換全てで使用可能

設定で変更出来る物 Edit

\d  Proxomitron本体があるディレクトリ(フォルダ)のフルパス Edit

directory
Proxomitron 本体があるディレクトリ(フォルダ)のフルパス。ローカルのJSファイル等を直接参照したい場合等に使用する。
「file:///D|/.../%21PROXY/PROXOMITRON/」の様な形で、URLエンコードされた物を返す。
A-Zのドライブ文字の後の文字は、4.5では「|」だが、4.3, 4.4は「:」になる。この部分は、File -> Open Local File URL(ファイル → ローカルファイル URL を開く) でも違う。
(4.5June+8 では、IE7対策のため常に「:」になるように修正された)

4.3, 4.4, 4.5June+8 では常に「:」を返し、
4.5May, 4.5June, 4.5June338(4.5June+3改), 4.5June+6, 4.5June+7 では常に「|」を返す。

ネットワークドライブ上にある Proxomitron を実行している場合、「file://///ComputerName/.../Proxomitron/」のような形になる。

Proxydomo v1.10以降、検索表現では\dは[0-9]+として機能する (v1.7~1.9では[0-9])
置換テキストではProxomitronと同じ(v1.56より前は未実装)

\x  全てのURLコマンドの前に必要な接頭語(Prefix) Edit

prefix
Config -> Access -> Prefix all URL commands with: (設定 → アクセス → 全てのURLコマンドの前に必要な接頭語)に設定した物を返す。

Config -> Access -> Disable URL based Proxomitron commands (設定 → アクセス → URL ベースの Proxomitron コマンドを無効にする) にチェックを入れていない場合、 勝手にURLコマンドのBypass, Bwebなどを使われないように、必ずユニークな文字列を設定しておいた方が良い。

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




複製名前変更