[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 06/14 00:44 / Filesize : 373 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Proxomitron フィルター作成スレッド Part5



1 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/07/10(月) 06:09:39 ID:8aujFXYU0]
このスレは作成依頼されたフィルタを
有志により作るスレッドPart4です
煽り、荒しは放置してください

【関連サイト】
Proxomitron-J
ttp://www.pluto.dti.ne.jp/~tengu/proxomitron/
日本語訳ヘルプ
ttp://www.pluto.dti.ne.jp/~tengu/proxomitron/help/Contents.html
本体(N4.5May)とその日本語化パッチ、OpenSSLライブラリのダウンロード
ttp://www.pluto.dti.ne.jp/~tengu/proxomitron/download.html
アップローダー
ttp://wind.prohosting.com/proxmine/cgi-bin/uploader/
4.5June+shift_jis誤爆回避日本語化+RWIN32768回避+バイパス赤icon+有難屋icon な本体
wind.prohosting.com/proxmine/cgi-bin/uploader/download.cgi?PmU_0338.zip
IE用必須設定(高速化)・過去ログ・FAQ・ime.nu消し・関連リンク
ttp://www2.wbs.ne.jp/~go-to/prx/faq.html

【関連スレ】
Proxomitron Part25
ttp://pc8.2ch.net/test/read.cgi/win/1115110149/
■■■■Proxomitron入門スレッド■■■■5
ttp://pc8.2ch.net/test/read.cgi/pcqa/1107577736/
ブラクラにProxomitronで対抗するスレPart5
ttp://pc8.2ch.net/test/read.cgi/software/1060792740/

【過去スレ】
Proxomitron フィルタ作成スレッド
ttp://pc5.2ch.net/test/read.cgi/software/1083337210/
Proxomitron フィルター作成スレッド Part2
ttp://pc8.2ch.net/test/read.cgi/software/1100052614/


792 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/15(日) 02:13:44 ID:cJDwpIgG0]
エロフィルタ解除しても使えるようにしてくれ

793 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/15(日) 03:32:16 ID:9zQhNVR/0]
ttp://www.geocities.jp/pmpfr555/30ninn.html
巨大なGIFアニメ。
Firefox 1.5.0.7 で読んだら20秒ほど重くなって応答しにくい状態になった。
さすがにこういうものをフィルタリングするのは無理かな?

794 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/15(日) 03:37:54 ID:JU/5VgGk0]
流れを読まずにmixi広告対策フィルタ投下。

[Patterns]
Name = "[User] Commune @ mixi"
Active = TRUE
URL = "*mixi.jp"
Limit = 1025
Match = "(<td (align="center" width="553"|) background=$AV(img.mixi.jp/img/title2-.gif)>"
"<img src=$AV(img.mixi.jp/img/dot0.gif)[^>]+><br>"
"\s<a href=(mixi.jp/|)banner.pl\?id=[^>]+>*</a></td>"
"$SET(1=<!-- Commune @ mixi - Edited by Proxomitron -->\n"
"<td align="center" width="553" height=60 background="img.mixi.jp/img/title2-.gif">\n"
"\t<img src="img.mixi.jp/img/dot0.gif" width=1 height=1>\n"
"</td>\n<!-- /Commune @ mixi - Edited by Proxomitron -->)"
"|(<(table|td)\s[^>]++width=)\2$AV(710)([^>]+>)\3"
"$SET(1=<!-- Commune @ mixi - Edited by Proxomitron -->\n"
"\2"950"\3\n<!-- /Commune @ mixi - Edited by Proxomitron -->\n)"
"|<td width="224" valign="middle">*/td>"
"$SET(1=<!-- Commune @ mixi - Blocked by Proxomitron -->\n)"
"|<table border="0" cellspacing="1" cellpadding="0" width="100%" bgcolor="#FF9933" style="margin-bottom: 5px;">"
"\s<tr><td>*/table>*/table>"
"$SET(1=<!-- Commune @ mixi - Blocked by Proxomitron -->\n))"
Replace = "\1"

長くてゴメンね。

795 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/15(日) 03:38:53 ID:JU/5VgGk0]
あ、またh抜き忘れたorz

796 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/15(日) 04:25:02 ID:OtboygnJ0]
>>795
俺が使ってるJaneViewにはgifをファイルサイズによって展開しない機能が付いてる。
2chに貼られたURLを普通のブラウザで見るならブラクラ食らうくらいの覚悟はしとくべき。

んでオミトロンでやるならcontent-typeとcontent-lengthの2つのヘッダを使って対応する。
でもcontent-lengthヘッダを送ってこない場合も多いからこの方法じゃ100%防ぐのは無理。

797 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/15(日) 08:42:51 ID:JU/5VgGk0]
>>793
普段は「GIFアニメーションを止める」にチェック入れておいて、
見たいときにだけ有効にする。

798 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/16(月) 17:02:58 ID:C/xlJM+p0]
URLを加工して新たなURLを作りたいんですが、$URL()の中で変数を使ってマッチされられないので途方に暮れています。
例えばURLを以下とします。
esearch.rakuten.co.jp/rms/sd/esearch/vc?sv=2&f=A&g=0&v=2&p=3&e=0&s=6&oid=000&k=0&sf=0&sitem=%A5%EF%A5%A4%A5%F3&x=0
そしてブロックファイルprefetchに
[^.]+rakuten.co.jp $SET(&p=)と登録して
何らかの処理によってこのURLのうち&p=3の部分を&p=4と書き換えて
<link rel="prefetch" href"esearch.rakuten.co.jp/rms/sd/esearch/vc?sv=2&f=A&g=0&v=2&p=4&e=0&s=6&oid=000&k=0&sf=0&sitem=%A5%EF%A5%A4%A5%F3&x=0">
というのをソースに挿入したいんです。

色々と考えたのですが、やはり変数を使ったマッチングの方法が思い浮かびません。
任意の数に対して+1した値を取り出す方法は思いつきますが、この場合にp=に続く数字を取り出すことができません。
アドバイスありましたら宜しくお願いします。

799 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/16(月) 17:25:02 ID:C/xlJM+p0]
>798に誤りがありました。
正しくは[^.]+rakuten.co.jp $SET(prefetch=&p=)です

thinkさんのウェブサイトを眺めていて思ったことは
ブロックリスト内で$SET(prefetch=$URL())のようにして、何とか"p="に続く文字列を取り出せないかということなんですが
あれこれ弄ってみたところ、まだうまく行きません。

800 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/16(月) 18:27:40 ID:pn9Wrk6v0]
動作させることには成功しましたが、結果はかなり期待はずれのものでした。
フィルタ自体はヘッダフィルタのURLCONTROLのアイデアをWebページフィルタに移植しただけです。
ブロックファイルは以下としました。
$URL(
([^.]+.rakuten.co.jp/?++\&p=)\0
([0-9]++)\1
(1$SET(2=2)|2$SET(2=3)|3$SET(2=4)|4$SET(2=5)|5$SET(2=6)|6$SET(2=7)|7$SET(2=8)|8$SET(2=9)|9$SET(2=0)|0$SET(2=1))
(*)\3
)
見やすくするために改行とスペースを入れましたが、実際には入れていません。
フィルタは以下です。
Name = "prefetch"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 256
Match = "</head>"
      "$LST(prefetch)"
Replace = "<link rel="next" href="\0\1\2\3">"
      "\n<link rel="prefetch" href="\0\1\2\3">"
      "\n</head>"

見ての通り、汎用性・管理性に乏しく、またブラウザ(Sylera)の動作が想像していたものとは違っていたので非常にorzです。
OPERAでグーグル検索をするとマウスジェスチャの「進む」で次の結果に進むので、
これはlinkタグの恩恵かと思っていたのですが、
このフィルタを入れても入れなくても楽天の商品検索ではOPERAは「進む」が効きますし、
使いたかったSyleraでは「進む」が効きませんでした。
兎にも角にもprefetchを効かせるフィルタとして、もう少し汎用性を高めていきたいと思います。
何かアイディアありましたら宜しくお願いします。



801 名前:793 mailto:sage [2006/10/16(月) 21:37:40 ID:9qp/s93b0]
>796
2chでないサイトに貼ってあったわけですよ……。
Content-Length を使う場合は、
$IHDR(Content-Type: image/gif) で
Content-Length が指定した値を超えたら\kするとか、そんな感じでしょうか?
参考になりました。ちょっと試してみます。

>797
これは簡単で即効性がありますね。
しかし、あまり使いたくないので、最終手段ということにしようと思います。

802 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/16(月) 23:09:08 ID:rXQtg6m60]
次のページに移るメソッドをスクリプトとして埋め込んでおいて
ブラウザのブックマークレットやスクリプトから呼ぶってのはどうだろ

ジェスチャにまでスクリプト割り当てられるかは知らんけど…

803 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/16(月) 23:49:31 ID:JE7pyNff0]
>>798が作りたいフィルターなら書けると思うがやりたいこととprefetchは無関係。
Operaは

<a href="〜">次へ</a>

等のリンクを検知して動いてる。 Operaの設定で「次」とかのキーワードを登録するところがあるんじゃないかな。
Syleraは知らないけどfirefoxならAll-in-One-Gesturesって拡張でまったく同じことが出来る。
これもリンク中の 「次」 等の文字を検知して動いている。

つまり上のようなリンクを挿入すればおk。 見栄えが悪くなるなら↓のように非表示にすればいい。

<a href="〜" style="display:none">次へ</a>

804 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/17(火) 00:20:12 ID:P1XwjcJ+0]
Operaフォルダのfastforward.ini に

> ;Japanese
> 次へ

ってのがあった、ここで設定するのかな?

805 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/17(火) 00:28:15 ID:o87r+yql0]
>>804
そこ

806 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/17(火) 00:33:15 ID:P1XwjcJ+0]
>>805
ありがと。 んじゃ後はフィルターを書くだけだね。

807 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/17(火) 01:16:32 ID:P1XwjcJ+0]
>>798
URL置換のサンプルフィルター。 www.google.co.jp/ で動作する。

[Patterns]
Name = "URL Replace test1"
Active = TRUE
URL = "www.google.co.jp/(^?)"
Limit = 256
Match = "<img src=$AV(*logo.gif)[^>]+>"
"$URL(www.google.(??)\0.jp/)"
"( $TST(\0=go)$SET(1=government) | $TST(\0=co)$SET(1=company) )"
Replace = "[\1] $STOP()"

マッチ欄の一行目はgoogleのトップ画像にマッチする。
二行目でURLの一部を \0 に取り込む。 この場合は co が取り込まれる。

三行目で \0 に取り込んだものをテストする。
\0 が go なら government が \1 に入る。
\0 が co なら company が \1 に入る。

808 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/17(火) 10:42:18 ID:1EbHilyf0]
>803
Operaの場合はfastforward.iniが効いてたんですね、すっかり忘れていました。
自分で手を加えて使いやすくしていたのに…。
スクリプトは苦手なので、Syleraに組み込めるかは自信がありませんがどうすれば可能かはようやく分かりました。

>807
このサンプルフィルタはどう使えばいいんでしょう。
当方のフィルタは少し使いやすくできました。
例は同じく楽天です。
[^.]+.rakuten.co.jp/*\&p= $URL(([^.]+.rakuten.co.jp/*\&p=[0-9]++)\#$LST(num+1)\#) $SET(prefetch=\@)
このようなブロックリストをフィルタのURL欄に入れてやればprefetch変数にprefetch先のURLを代入しますので
フィルタ自体も扱いやすくなり、またブロックリストから全ての管理を行えるので管理性も良くなったと思います。
なおURL欄でローカル変数を使ってもマッチング欄その他には変数を渡せないようです。(初期値にリセットされる)
ちなみに$LST(num+1)は一文字の数字を取り込んでそれより1だけ大きい数をスタックに追加するようなブロックリストです。

今気が付いたのですが、p=に続く数字をインクリメントするときに桁上げがあると少しやっかいですね。
数字を数字として扱えないproxomitronの欠点ですが、再帰的にブロックリストを構成することでなんとかなりそうです。

809 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/17(火) 10:43:56 ID:1EbHilyf0]
ブロックリストincrement
( $TST(num=([0-9]++)\09) $SET(num=\0) $SET(num2=0$GET(num2)) $LST(increment) | $TST(num=([0-9]++)\0$LST(num+1)) $SET(num=\0\@$GET(num2))

動作を検証してみる。
再帰的なブロックリストincrementを構成。
まずは初期値としてnumに19を代入してみる。
テストをしてnumの下一桁が9の場合には下一桁以外の数字をnum変数にリセットするのでnum変数が1になる。
と同時にnum2変数に0がセットされる。
そして最後に$LST(increment)が繰り返される。
最初に戻って、テストをしてnumの下一桁が9であるかを調べるが、この時点でnum変数は1なのでTSTの結果は偽。
よってOR関数の後者に移動する。
まずテストをしてnumの下一桁を$LST(num+1)で取り出し一つ大きな値をスタックに代入する。
ここではスタックに2が代入される。
次にnumの下一桁以外+スタックに入っている一桁の数字+今までにnum2に入った数字が代入される。
ここで最初の値は空値であり、次の値は2であり、最後の値は0である。
以上から初期値19に対して1だけ大きい20がセットされる。

こんなブロックリストが実際に動くかはまだ検証していません。
時間がある人が居れば試してみてください。

810 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/17(火) 13:32:12 ID:8nUFKOs50]
webフィルタなら適当なローカル変数に取り込んだあと
javascriptで処理させるのがセオリー



811 名前:think ◆MM0nnAOCiQ mailto:sage [2006/10/17(火) 18:01:22 ID:C/FhEIND0]
>>798-800,808-809
とりあえず、名前を固定化してください。
IDが変わると、誰が誰だかわからなくなります…。

>>809
> なおURL欄でローカル変数を使ってもマッチング欄その他には変数を渡せないようです。
ブロックリストの中なら変数への取り込みが効くと思うのですが、いかがでしょうか?
下記をブロックリストに登録すれば、"\@" で加工後のURLを挿入できます。

([^.]+.rakuten.co.jp/rms/sd/esearch/vc\?*\&p\=)\#(1$SET(#=2)|2$SET(#=3)|3$SET(#=4)|4$SET(#=5))(^(^\&|(^?)))\#

> 今気が付いたのですが、p=に続く数字をインクリメントするときに桁上げがあると少しやっかいですね。
先の表現では、(^(^\&|(^?))) で後ろに続く数字の存在を先読みチェックしています。
後述に "&" か (^?) があれば、そこで数字が終わることになります。

812 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/17(火) 18:25:03 ID:emUaxh1m0]
(^[0-9]) でもいいね。

813 名前:803 mailto:sage [2006/10/17(火) 19:37:17 ID:emUaxh1m0]
オミトロンで数字を+1するだけなら何桁の数字であっても出来そうな気がしてきた。

+ を使った繰り返し処理、 "繰り上がり" を意味する記号 "X" を使って以下のような処理をする。
X0 は 10 を意味し、 3X0 は 40 を意味するものとする。


(999に1を足す場合)

1、下一桁の 9 を X0 に置換する。 下一桁が 9 以外だったら従来通りの方法で置換し、終了。
  ⇒ 999 が 99X0 に置換される。

2、 99X0 の中の 9X を X0 に置換。 9X00 になる。

3、 9X00 の中の 9X を X0 に置換。 X000 になる。

4、 先頭が X なので X を 1 に置換し、+ループ終了。

このようにして記号 X が無くなるまでループさせれば自動的に +1 処理が完了する。

>>808
>>807はURLの一部を取り出してから処理する方法を示したものです。
フィルターがごちゃごちゃしてしまう場合にこうすると全体の処理過程が分かりやすくなる例です。
今回の件ではもう必要無いので忘れて下さい。

814 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/18(水) 18:46:17 ID:0r+ECrj30]
yahooでard.yahoo.co.jp/SIGで始まってるテキスト広告を消したいのだけどいいフィルターあるかな。

815 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/18(水) 19:10:53 ID:Oxpb2xGt0]
>>794
mixiのソースが変わってマッチしなくなってる。 書いた直後に仕様変更とはなんと間の悪い..。

>>814
>>1のうpろだにあるよ。

816 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/18(水) 19:57:20 ID:Oxpb2xGt0]
mixiはこれでどうかな、とりあえず上の広告だけ消すフィルターを修正してみた。
mixiのアカウントが某バーガー祭りで巻き添え削除食らったのでログインしても効くかは不明。

[Patterns]
Name = "mixi banner cleaner [2006-10-18]"
Active = TRUE
URL = "$TYPE(htm)([^/]++.|)mixi.jp/"
Limit = 4096
Match = "$NEST(<script,*ads.mixi.jp*,</script>) <noscript>*</noscript>$STOP()"
Replace = "<div style="background-image: url(img.mixi.jp/img/title2-.gif); width:468px; height:60px; border=0px;"></div>"

あとyahooとうたまっぷの歌詞表示のフィルターの修正済みのを>>2のうpロダに上げておきました。

817 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/18(水) 21:57:54 ID:bPOL+aCR0]
横スクロールバーの発生を防ぐためのフィルタなのですが、
ひとつ困ったことがあります。

Name = "css width limiter (2006.10.18)"
Active = TRUE
URL = "$TYPE(css)|$TYPE(htm)"
Limit = 64
Match = "$KEYCHK(c)width : ([#751:*]px|[#91:*]%)\1$SET(2=auto) (;|)\3|"
"$KEYCHK(v)width : ([#751:*]px$SET(2=750px)|[#91:*]%$SET(2=90%))\1 (;|)\3|"
"width : ([#751:*]px$SET(2=750px)|[#100:*]%$SET(2=auto))\1 (;|)\3"
Replace = "width: \2\3 /* css width limited - \1 */"

Replace で「/* */」のようにコメントを挿入しているのですが、
マッチするテキストがすでにコメントの中にあった場合、
コメントが二重になってしまいます。

Replace = "width: \2\3"
これで解決することもできますが、
Replace から「/* */」を削除せずともよい方法はありませんか?

818 名前:think ◆MM0nnAOCiQ mailto:sage [2006/10/18(水) 22:08:08 ID:dpbYjLHS0]
>>817
Limitを少し大きくして (^(^*/\*|(^*\*/))) を検索表現の末尾に挿入してはどうでしょう?
コメント内部にはマッチしなくなります。

819 名前:817 mailto:sage [2006/10/19(木) 00:47:01 ID:64qsfQ3f0]
>818
どうもありがとうございます。

Limit = 256
Match = "($KEYCHK(c)width : ([#751:*]px|[#91:*]%)\1$SET(2=auto) (;|)\3|"
"$KEYCHK(v)width : ([#751:*]px$SET(2=750px)|[#91:*]%$SET(2=90%))\1 (;|)\3|"
"width : ([#751:*]px$SET(2=750px)|[#100:*]%$SET(2=auto))\1 (;|)\3)(^(^[^/*]+/\*|(^[^/*]+\*/)))"

一応、上記とすることで解決しました。
「/*」または「*/」があっても消費させずにそのまま残すようなしくみなのでしょうか。
また、(^(^*/\*|(^*\*/))) の部分についてですが、

/* max-width: 200%; */
max-width: 200%;
/* min-width: 100%; */
min-width: 100%;

このような文字列でテストすると1行目のコメントが多重になってしまうので
一部をいじってみました。
これでしばらくテストしてみます。

820 名前:817 mailto:sage [2006/10/19(木) 01:08:10 ID:64qsfQ3f0]
>819だと
/* max-width: 200%; / */
こんなのにマッチしてしまいますね。ケアレスミスでした。
いろいろ試していますが、いまのところ望み通りの Match が見つかりません。



821 名前:794 mailto:sage [2006/10/19(木) 04:20:49 ID:Rp4XmZBf0]
>>815>>816
本当にうpした後に変更しおった、なんてこったい。
>>816のフィルタもログイン後でも正常に動作したよ。
教えてくれてありがとう。

height を 1pix 足したら、ほぼそのままで使えてしまった(゚∀゚)アヒャ
戻されても使えるように以前の条件をORで含めているけれど、
必要ない場合は削除。

822 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/19(木) 04:21:23 ID:0avczPwd0]
>>816
問題なく動くよ。thx

823 名前:794 mailto:sage [2006/10/19(木) 04:22:13 ID:Rp4XmZBf0]
[Patterns]
Name = "[User] Commune @ mixi"
Active = TRUE
URL = "*mixi.jp"
Limit = 1673
Match = "(<td (align="center" width="553"|) background=$AV(ttp://img.mixi.jp/img/title2-.gif)>"
"<img src=$AV(ttp://img.mixi.jp/img/dot0.gif)[^>]+><br>\s"
"(<a href=(ttp://mixi.jp/|)banner.pl\?id=[^>]+>*</a>"
"|<script type="text/javascript"*"ttp://ads.mixi.jp"*</noscript>)\s</td>"
"$SET(1=<!-- Commune @ mixi - Edited by Proxomitron -->\n"
"<td align="center" width="553" height=61 background="ttp://img.mixi.jp/img/title2-.gif">\n"
"\t<img src="ttp://img.mixi.jp/img/dot0.gif" width=1 height=1>\n"
"</td>\n<!-- /Commune @ mixi - Edited by Proxomitron -->\n)"
"|(<(table|td)\s[^>]++width=)\2$AV(710)([^>]+>)\3"
"$SET(1=<!-- Commune @ mixi - Edited by Proxomitron -->\n"
"\2"950"\3\n<!-- /Commune @ mixi - Edited by Proxomitron -->\n)"
"|<td width="224" valign="middle">*/td>"
"$SET(1=<!-- Commune @ mixi - Blocked by Proxomitron -->\n)"
"|<table border="0" cellspacing="1" cellpadding="0" width="100%" bgcolor="#FF9933" style="margin-bottom: 5px;">"
"\s<tr><td>*/table>*/table>"
"$SET(1=<!-- Commune @ mixi - Blocked by Proxomitron -->\n))"
Replace = "\1"

824 名前:816 mailto:sage [2006/10/19(木) 08:21:48 ID:I4R88+570]
>>821-822
動作確認ありがとうございます! >>816のフィルターは後で>>2のうpロダに上げときますね。

>>823
乙です。 あまり変更が無いとはラッキーでしたねw


ーーーーーーー
>>813で書いたものが一応動くようになったので晒しておきます。 まだ無駄が多いのでbeta版扱いで。
テストウインドウに 9999 などを入れてテストしてみて下さい。 では。

[Patterns]
Name = "number +1 (2006-10-19 beta)"
Active = FALSE
Limit = 256
Match = "(([0-9])\8($TST(F=roop)|(^(^([0-9]+)\9))$SET(C=up)$SET(F=roop)$TST(\9=\7)$SET(A=\8\7)$SET(7=)$SET(9=))"
"$TST(A=\0([0-9])\1(^?))($TST(C=up)$SET(C=)$TST(\1=(0$SET(2=1)|1$SET(2=2)|2$SET(2=3)|3$SET(2=4)|4$SET(2=5)"
"|5$SET(2=6)|6$SET(2=7)|7$SET(2=8)|8$SET(2=9)|9$SET(2=0)$SET(C=up)))$SET(B=\2$GET(B))|$SET(B=\1$GET(B)))"
"($TST(\0=[0-9]*)$SET(A=\0)|$SET(A=))$SET(0=)$SET(1=)$SET(2=))+{1,*}($TST(C=up)$SET(B=1$GET(B))|)"
Replace = "$GET(B)$SET(A=)$SET(B=)$SET(C=)$SET(F=)$STOP()"

825 名前:816 mailto:sage [2006/10/19(木) 14:03:18 ID:6Is2YjIm0]
よく考えてみると数字に+1するのにループは必要無さそう。
このアルゴリズムさえ思い付けばすごく簡単だ。

826 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/19(木) 16:32:46 ID:pqx0j20y0]
>>824-825
お疲れ様です。
興味深いトピックだったので、私も挑戦してみました。

[Patterns]
Name = "number +1 [Match ver] [2006/10/19] test6.1"
Active = TRUE
Limit = 32767
Match = "([0-9]++)\#([0-9])\0(9+{1,*})\1"
"$TST(\0=$LST(Num-plus))"
"$TST(\1=($LST(Num-plus))+)|"
"([0-9]++)\#([0-9])\0"
"$TST(\0=$LST(Num-plus))"
Replace = "\@"

Name = "number +1 [$TST ver] [2006/10/19] test5.1"
Active = TRUE
Limit = 32767
Match = "([0-9]+)\0"
"("
"$TST(\0=([0-9]++)\#([0-9])\1(9+{1,*})\2)"
"$TST(\1=$LST(Num-plus))"
"$TST(\2=($LST(Num-plus))+)|"
"$TST(\0=([0-9]++)\#([0-9])\1)"
"$TST(\1=$LST(Num-plus))"
")"
Replace = "\@"

827 名前:think ◆MM0nnAOCiQ mailto:sage [2006/10/19(木) 16:34:35 ID:pqx0j20y0]
>826です。名前入れ忘れましたw

## $LST(Num-plus) の中身

0$SET(#=1)
1$SET(#=2)
2$SET(#=3)
3$SET(#=4)
4$SET(#=5)
5$SET(#=6)
6$SET(#=7)
7$SET(#=8)
8$SET(#=9)
9$SET(#=0)

"Match ver" の方が若干高速ですが、取り込むフィルタによっては、"$TST ver" の方が都合がよい場合もあるので2パターンのフィルタを用意してみました。
心なしか "$TST ver" の方がすっきりしているような気も…。
まあ、たいした速度差はないので、好みで選んで構わないと思います。

アルゴリズムは>813,824とは全く違います。
フィルタの構成としては、繰り上がりが発生するときと発生しないときで処理を分岐させています。

・繰り上がりが発生しないときには、末尾の数字に +1
・繰り上がりが発生するときには、末尾の 999... を 0にし、繰り上がる桁の数値を +1

という仕組みです。

828 名前:think ◆MM0nnAOCiQ mailto:sage [2006/10/19(木) 16:54:12 ID:pqx0j20y0]
>>820
えー、そんな妙なコメントあるのかなあ。
・・・と、愚痴は置いておいて。

よく考えたら、(^((^\*/|/\*)?)+\*/) の方が厳密かつシンプルでした。
(私はシンプルに感じますが、大半の人はシンプルと受け取れないかも…)
「"*/" か "/*" の手前まで先読みして、その後ろに "*/" が存在してはならない」という表現です。
実は私の好きな表現でして、覚えておくとたまに役立ちます。


# 蛇足
>826のLimitが異様に大きいのは気にしないでください。(速度計測時の名残です…。)
実際に、フィルタに取り込むときにはもっと小さな値のLimitで作成することになると思います。

829 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/19(木) 18:18:18 ID:jrvNMl2x0]
>816さん、thinkさんがしっかりしたものを作り上げてくれたようなのでありがたいです。
あとはこれをリストにぶちこんで、モジュール化させれば簡単に
任意の箇所の一続きの数字列に対して1だけ大きい数を得ることができますね。

830 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/19(木) 18:21:06 ID:jrvNMl2x0]
むむ、リストに入れなきゃいけないわけではないけど、フィルタの中に突然↑のような処理が入ったら
なんのことやら混乱する可能性があるので可読性という点でリスト化させたほうが良いかなと思います。



831 名前:816 mailto:sage [2006/10/20(金) 00:59:27 ID:ELREBDG20]
>>826
乙です。

> 繰り上がりが発生するときには、末尾の 999... を 0にし、繰り上がる桁の数値を +1

これこそ>>825に書いた簡単なアルゴリズムです。 これに気付いていれば>>824みたいな難解で遅いものを
書く必要は無かったですね。 でも、 ローカル変数でも $SET(0=) 等で明示的に初期化する必要がある
場合があることなど、今まで知らなかったオミトロンの挙動が次々に出てきたのでなかなか楽しめました。

PS、
数字が 999 などの 9 の繰り返しだった場合に 000 などになってしまうようです。

>>829
リスト化すれば使い回しがしやすくて便利そうですね。
完成したらどこかで配布してみてはいかがでしょう、きっと重宝されると思います。

あと、リストを使った回帰的処理というのは面白い発想でした。
これが正しく動作するとすれば複雑な処理が簡単に書けるようになりますね。

832 名前:817 mailto:sage [2006/10/20(金) 01:36:13 ID:wAdVERPl0]
>828
どうもありがとうございます。ばっちり解決していますね。
>820のような妙なコメントを書く人はあまりいないだろうと思いますが、
書かれることを想定しておいた方が後々のためになるだろうと思います。
フィルタを作る際は、一応はあらゆる場合を想定しておいた方が
安心して使えるだろうと思うので……。
解説もありがとうございました。

>828のようなテクニックを集めたサイトがあるとよいと思うものの、
wikiやthinkさんのサイト内などにはあるのかな。

833 名前:816 mailto:sage [2006/10/20(金) 04:46:14 ID:kgbwGCqt0]
リストを使ったループもちゃんと動作しますね。 オミトロンでここまで出来るとは...。

[Patterns]
Name = "LIST rooptest"
Active = FALSE
Limit = 256
Match = "$LST(rooptest)"
Replace = "[\@]$STOP()"

----------------rooptest.txt----------------
(1)\#($LST(rooptest)|)
----------------rooptest.txt----------------

テストウインドウ: 111
結果: [111]

834 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/20(金) 04:49:49 ID:H4LiK3bO0]
どうでもいい話、ループの最大回数がわかってる場合は
(?)+{1,4}とか決め付けると極端に高速化したような気がした。
今はもうこれ自体使ってないからかなり忘れかけてるけど。

835 名前:816 mailto:sage [2006/10/20(金) 05:06:17 ID:kgbwGCqt0]
>>834
30000バイトの文字列をテストウインドウに貼って

(?)+{30000}
(?)+

の2つの速度をプロファイルボタンから調べて比べてみたんですが限りなく同タイムでした。
高速化したというのはたぶんlimitと同じような目的で使った場合の話ですね。

836 名前:816 mailto:sage [2006/10/20(金) 07:02:24 ID:kgbwGCqt0]
>>826
test6.1のほうですがテストウインドウに111と入れると222になったりしたので修正してみました。
「 + 」 での取り込みで最短一致でマッチングしてるのが原因でした。 ついでに 000 の問題も修正。
もっといい方法があれば手直しを。

[Patterns]
Name = "number +1 [Match ver] [2006/10/19] test6.2"
Active = TRUE
Limit = 32767
Match = "(9+{1,*})\0(^[0-9])$TST(\0=$SET(#=1)(9$SET(#=0))+)"
"|([0-9]++)\#([0-9])\0(9+{1,*})\1(^[0-9])"
"$TST(\0=$LST(Num-plus))"
"$TST(\1=($LST(Num-plus))+)|"
"([0-9]++)\#([0-9])\0(^[0-9])"
"$TST(\0=$LST(Num-plus))"
Replace = "[\@]"

837 名前:816 mailto:sage [2006/10/20(金) 07:09:54 ID:kgbwGCqt0]
すみません、余計酷くなってしまいました。 ↑は無かったことに....。

838 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/20(金) 15:16:57 ID:pRyei5xN0]
以前、永久ループに陥ってから倦厭していた$NESTが何となく解るようになった。
少し進歩した(゚∀゚)アヒャ

839 名前:think ◆MM0nnAOCiQ mailto:sage [2006/10/20(金) 22:19:35 ID:sNjWaFpG0]
>>831
> 完成したらどこかで配布してみてはいかがでしょう
出来れば、今日コンテンツに加えて更新したいところです。遅くとも明日には何とか…。

>>831
> あと、リストを使った回帰的処理というのは面白い発想でした。
>>832
> >828のようなテクニックを集めたサイトがあるとよいと思うものの、

実は「フィルタ公開 → 仕組み解説」という形でいくつかのテクニック解説をコンテンツに加えようと考えていましたが、考えるだけで先に進まないので、そろそろ始動しようと考えてます。
今サイトを改装中なので、そのときにフィルタ公開だけでもやってしまおうかと。
# 先にフィルタを公開すれば、要望or突っ込みなどいただけるかもしれませんしね。
# 別所で公開していたフィルタがあるので、皆さんが知っているフィルタも幾つかあると思います。(勘の鋭い方は既に気がついているかもしれませんねw)

>>836
> 「 + 」 での取り込みで最短一致でマッチングしてるのが原因でした。
確かに困りますね、これは。
どうも私の最短一致についての認識が甘いみたいです。
(以前も * の最短一致で指摘されたことがありましたが、未だに勘違いしている節があります(汗))
解決法としては、

・数値の先端/末尾を含めてマッチさせる (最長一致とほぼ同等)
・数値の末尾のみにマッチさせる (必要な箇所だけ最短一致)

のいずれかと思います。

840 名前:think ◆MM0nnAOCiQ mailto:sage [2006/10/20(金) 22:20:45 ID:sNjWaFpG0]
>839の後者の方で解決してみました。

[Patterns]
Name = "number +1 [Match ver] [2006/10/20] test6.3"
Active = TRUE
Limit = 32767
Match = "([0-9]++)\#([0-8])\0(9+{1,*})\1(^[0-9])"
"$TST(\0=$LST(Num-plus))"
"$TST(\1=($LST(Num-plus))+)|"
"([0-9]++)\#([0-8])\0(^[0-9])"
"$TST(\0=$LST(Num-plus))|"
"(9+{1,*})\1(^[0-9])"
"$SET(#=1)"
"$TST(\1=($LST(Num-plus))+)"
Replace = "\@"

Name = "number +1 [$TST ver] [2006/10/20] test5.3"
Active = TRUE
Limit = 32767
Match = "([0-9]+)\0(^[0-9])"
"("
"$TST(\0=([0-9]++)\#([0-8])\1(9+{1,*})\2)"
"$TST(\1=$LST(Num-plus))"
"$TST(\2=($LST(Num-plus))+)|"
"$TST(\0=([0-9]++)\#([0-8])\1)"
"$TST(\1=$LST(Num-plus))|"
"$TST(\0=(9+{1,*})\1)"
"$SET(#=1)"
"$TST(\1=($LST(Num-plus))+)"
")"
Replace = "\@"



841 名前:think ◆MM0nnAOCiQ mailto:sage [2006/10/20(金) 22:28:33 ID:sNjWaFpG0]
あと一行、書ければ…。

>>831
> 数字が 999 などの 9 の繰り返しだった場合に 000 などになってしまうようです。
こちらは、もう一つ分岐を作ることで対応しました。
よく考えたら、([0-9])\0 じゃなくて ([0-8])\0 で良かったのですよね。
これで3つめの分岐が期待通りに動作すると思います。

842 名前:816 mailto:sage [2006/10/21(土) 02:22:58 ID:62B1+yNF0]
>>839-841
サイト更新予定ですか、乙。 フィルターの公開とはとても楽しみです。
テクニック解説も期待してます、頑張って下さい。

>number +1 フィルター

修正乙です、ばっちり修正されてました。

あと、ちょっと考えてみたんですが、以下のことが気になったので

・ 下一桁が 9 である確率は 1/10 なのでこれにマッチするものを分岐の先頭に書くのは低速化になるような
・ 9 の繰り返しを 0 に置換するときはリストを使わずに $SET(#=0) を使ったほうが速い

自己流のものですが試しに書いてみました。

843 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/21(土) 02:29:26 ID:62B1+yNF0]
[Patterns]
Name = "number +1 (2006-10-21 beta3)"
Active = FALSE
Limit = 32767
Match = "([0-9]++)\#([0-8])\0(^[0-9])"
"$TST(\0=$LST(Num-p-Ten))"
"|"
"9(^[0-9])$SET(#=10)"
"|"
"([0-9]++)\#"
"([0-9])\0"
"(9+{1,*})\1"
"(^[0-9])"
"$TST(\0=$LST(Num-p-Ten))"
"$TST(\1=(?$SET(#=0))+)"
Replace = "\@"

-------Num-p-Ten.txt------
0$SET(#=1)
1$SET(#=2)
2$SET(#=3)
3$SET(#=4)
4$SET(#=5)
5$SET(#=6)
6$SET(#=7)
7$SET(#=8)
8$SET(#=9)
9$SET(#=10)
-------Num-p-Ten.txt------

このフィルターの場合、Num-plusリストの "9" で # に "10" を代入しても支障が無いので別のリスト名にして変更しました。
このせいで他のフィルターでリストの使い回しが出来なくなるのであれば元に戻す方向で。

844 名前:816 mailto:sage [2006/10/22(日) 07:56:03 ID:giDEESQO0]
>>824>>840>>843 の3つのフィルターの速度を3万文字の数字で試してみたら>>824が一番速い。
かなり予想外・・。

845 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/22(日) 08:54:24 ID:pIhJV0rv0]
処理にかかる時間は

 4   :  10   :   5
>>824   >>840    >>843

くらいの倍率になるようですね、>>843の高速化も予想以上に効いてます。

846 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/23(月) 06:41:54 ID:r0C1Bci+0]
所でオミトロンで数を+1することでどんなことが出来るんだ?

847 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/23(月) 13:46:05 ID:KvMb1J5K0]
主にcgiを中心としたURLだね。
あと一部のサイトにはサイトを番号で階層的に構築しているものもあるだろうから
そういう場合に次ぎのカテゴリに飛ぶリンクやカテゴリ内の次のページに飛ぶリンクを埋め込むことができると思われる。

ちなみにURLの処理の場合はソース内のそれと比べて遙かに量が少ないので高速化したところで意味はほとんどない。
彼らは単なるベンチマニアなので気にしないでおいてあげようw


848 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/23(月) 18:55:30 ID:MzXqWBCb0]
みんな頭がいいんだな。
もう何がなんだか(´・ω・`)ショボーン

849 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/23(月) 19:30:43 ID:r0C1Bci+0]
JSオフにしてる人用って事か

850 名前:think ◆MM0nnAOCiQ mailto:sage [2006/10/23(月) 20:46:24 ID:LNHCxGv10]
>>842
> ・ 下一桁が 9 である確率は 1/10 なのでこれにマッチするものを分岐の先頭に書くのは低速化になるような
> ・ 9 の繰り返しを 0 に置換するときはリストを使わずに $SET(#=0) を使ったほうが速い
なるほど。

>>843
([0-9]++)\#([0-9])\0(9+{1,*})\1 は面白いですね。この発想はありませんでした。
9999... の数値の置換が高速に動作するのが良い感じですね。

>>844
> 3万文字の数字で試してみたら>>824が一番速い。
おそらく、OR関数を使用している影響だと思います。
実際、ORの先頭の表現にマッチさせる条件だと、速度差がかなり小さくなります。



851 名前:think ◆MM0nnAOCiQ mailto:sage [2006/10/23(月) 20:47:43 ID:LNHCxGv10]
あれからもう一度、初心に返って考え直してみたら、驚くほどスリムなフィルタになりました。

[Patterns]
Name = "number +1 [Match ver] [2006/10/23] beta1"
Active = TRUE
Limit = 32767
Match = "(^(^[0-8]9+(^[0-9])))$LST(Num-plus)(9$SET(#=0))+|"
"(^(^9))$SET(#=1)(9$SET(#=0))+(^[0-9])"
Replace = "\@"

Name = "number +1 [$TST ver] [2006/10/23] beta1"
Active = TRUE
Limit = 32767
Match = "([0-9]+)\0(^[0-9])("
"$TST(\0=\#(^(^[0-8]9+(^?)))$LST(Num-plus)(9$SET(#=0))+)|"
"$TST(\0=$SET(#=1)(?$SET(#=0))+))"
Replace = "\@"

>842のアドバイスを受けて、ブロックリスト(Num-plus)から "9$SET(#=0)" を外し、更に ([0-9]++)\# を省きました。
>839で紹介した「数値の末尾のみにマッチさせる (必要な箇所だけ最短一致)」の応用形です。
我ながら、高速でシンプルなフィルタに仕上がったと思います。

852 名前:think ◆MM0nnAOCiQ mailto:sage [2006/10/23(月) 20:57:23 ID:LNHCxGv10]
>>846
「相対URL → 絶対URL」にするときに ../ の出現回数をカウントして繰り返し処理させたいと考えたことがあります。
「+1 するフィルタ」を応用すると、「-1 するフィルタ」も出来そうなので、 「../ が何度出現しても絶対URLにするフィルタ」が作れそうです。
(今までは繰り返し回数を1〜4回のように決めうちして、ORで指定していました)
決めうちでもほとんどの状況を網羅できるので、わざわざグローバル変数を使ってまで実現する必要があるかというと疑問が残りますが…。

また、「グローバル変数に『特定の文字列』が何回マッチしたか記憶させたい」と考えたことも。
何度か出た話題ですが、行数も \n の数をカウントすれば、取得できます。
行数でなくても、「ある単語」がn回HITしたら、フィルタを働かせるロジックは応用が利きそうですね。

>>847
> 彼らは単なるベンチマニアなので気にしないでおいてあげようw
アルゴリズムマニアも加えておいてくださいw

853 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/23(月) 21:31:20 ID:7VXS0HXl0]
画像を全部lightboxで表示するフィルタ書いてもらえませんか

854 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/23(月) 21:53:44 ID:4SBEQqzk0]
そういえば昔、相対URLを絶対URLにするフィルタをつくろうとして
断念したことがあったっけ。
不要な画像つきリンクをテキスト化して軽くするフィルタなんだけれども。
今では別のフィルタで対応しているからつくる必要がなくなった。

855 名前:816 mailto:sage [2006/10/24(火) 03:02:33 ID:96jgfWU+0]
>>850-851
乙です。 なるほど、こういう方法もありましたか。 置換に必要な場所にだけマッチさせる方法があったとは..。

それぞれのフィルターの速度を3万文字の数字で比較してみました。
計測には差が出やすいようにスーパーπ104万桁10分台の遅いマシンを使用。

---------------------------------------------------------------------
         (1)      (2)      (3)       (4)     (5)
        000.....0    000.....09    199.....9      999.....9   999....90    ( 対象文字列 )

>>824   43.319444   43.409722   49.640625   49.437500  46.897059   ( ミリ秒 )

>>843   48.953125   100.375000   70.340909   70.238636  33.804348

>>851   59.951923   60.000000   33.820652   25.366667  計測不能(応答なし)
---------------------------------------------------------------------

>>851のフィルターは 99999.. の後ろが 9 以外の数字で終わる場合に極端に時間がかかるようです。
実用的には問題無いと思われますがちょっと気になります。 先読みで数字の末尾を確認する
処理を入れたほうが良いかも..。

(3)、(4) の速さがすごいですね、高速化済みの>>843の3倍も速いとは...w

>>824は対象がどんな数字でも安定してることが分かります。
>>843は対象の末尾が 9 の場合をイレギュラーと考え、この場合の速度を無視した書き方なので
9 で終わる場合は遅いですね。

856 名前:816 mailto:sage [2006/10/24(火) 03:42:20 ID:96jgfWU+0]
>>846
〜/00581.jpg
〜/00582.jpg
〜/00583.jpg

みたいな連番の画像ファイルを見るときにブラウザをリロードするだけで次々に見れるようになります。
他にも応用次第で色々なことに使えるはず。

>>848
慣れればそのうち書けるようになるはず。

>>849
JSでは出来ないことにも使えるはず。 HTTPヘッダの置換等。

>>852
>わざわざグローバル変数を使ってまで

今まではグローバル変数を使うとすごく遅くなるという固定観念を持ってましたが
>>824を見るとそうでもなさそうなんですよね。 遠慮せずにもっと使うべきものなのかも。

>>854
>相対URLを絶対URLにするフィルタ
それらしきフィルターをどこかで見た。

857 名前:816 mailto:sage [2006/10/24(火) 06:48:23 ID:96jgfWU+0]
あれ、>>824は対象文字列が3文字などの短い場合は他のよりかなり遅い。 グローバル変数のせいだろうか。
グローバル変数は動的な生成とその解放をするときに時間がかかるが、
代入や取り出しにかかる時間はローカル変数と変わらない...ってことかな?

>>855に書いた 999... の末尾が 9 以外の場合に遅くなるという件は "#" の回数制限の100文字程度なら
プロファイルでも全然問題なく動作しますね。 3万文字の場合でもプロファイルでなく普通にテストする分には
正常に動作するから修正の必要は無いか。

858 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/24(火) 07:40:31 ID:iS+1bFGh0]
>>853
abc.s65.xrea.com/prox/wiki/%A5%D5%A5%A3%A5%EB%A5%BF%A1%A2%A5%EA%A5%B9%A5%C8%B8%F8%B3%AB/Image%20Popup/

859 名前:816 mailto:sage [2006/10/24(火) 08:14:51 ID:96jgfWU+0]
応答なしの問題を回避するために>>851に手を入れてみました。 変更点↓

・ 9999.. の末尾の先読み判定を前に移動。
・ (^[0-9]) を (^[0-8]) に修正。
・ (^(^ 〜 )) から && に代えてみました。 タイム比較用。

[Patterns]
Name = "number +1 (2006-10-24) beta4"
Active = FALSE
Limit = 32767
Match = "([0-8]9+(^[0-8])&&$LST(Num-plus)(9$SET(#=0))+)|"
"(9+{1,*}(^[0-8])&&$SET(#=1)(9$SET(#=0))+)"
Replace = "\@"

// (^(^9))9$SET(#=0) は (^(^9))?$SET(#=0) より速いんですね、これも意外..。

860 名前:816 mailto:sage [2006/10/24(火) 08:30:32 ID:96jgfWU+0]
タイム比較の結果は (^(^ 〜 )) >>> && でした。 以上。



861 名前:816 mailto:sage [2006/10/24(火) 08:32:00 ID:96jgfWU+0]
※ (^(^〜))[速い] >>> &&[遅い]  です。

862 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/24(火) 10:18:39 ID:PwmdsW1B0]
www.so-net.ne.jp/tv/bangumi/tvprgm/1_29_0.html
>テレビ王国 > 10月24日(火)の番組表 [地上波/奈良/ 5-12時]
から上を消すフィルタお願いします。

>商号変更のおしらせ 「ソネットエンタテインメント株式会社」へ [PDF]
>[テレビ王国ランキング!レポート全国版] 10/16〜10/22分リリース!!
>テレビも動画も!あなたの好みに合わせてオススメ!
>ドラマ情報続々!この秋スタートドラマを事前にチェック。
など
>テレビ王国 > 10月24日(火)の番組表 [地上波/奈良/ 5-12時]
より上すべて消したいです。

863 名前:816 mailto:sage [2006/10/24(火) 16:29:32 ID:96jgfWU+0]
うわ〜! >>824のlimitが256のままだった。 これでテストすれば早いのは当たり前..。
再テストしたら比較にならないほど遅かった、>>824はボツ決定です..。(^^;A

次にグローバル変数とローカル変数の比較。
test1がグローバル変数を使ったフィルター、test2がローカル変数を使ったフィルターです。

[Patterns]
Name = "test1"
Active = FALSE
Limit = 32767
Match = "0$SET(A=1)"
Replace = "$GET(A)$SET(A=)"

Name = "test2"
Active = FALSE
Limit = 32767
Match = "0$SET(0=1)"
Replace = "\0"

(対象文字列を100文字の "000...0" にしてテスト)
結果: test1 → 0.172000 (milliseconds)、 test2 → 0.000000 (milliseconds)

(対象文字列を3万文字の "000...0" にしてテスト)
結果: test1 → 51.825000 (milliseconds)、 test2 → 4.156000 (milliseconds)

100文字のテストに比べると3万文字ではだいぶタイムの倍率は下がったが、それでも10倍以上遅い。
グローバル変数はなるべく避けたほうが良いでFAですね...。

864 名前:think ◆MM0nnAOCiQ mailto:sage [2006/10/24(火) 22:42:54 ID:vquh73VO0]
>>855
> 99999.. の後ろが 9 以外の数字で終わる場合に極端に時間がかかるようです。
こんな限定された状況に、よく気がつきましたね!
原因は仰るように、\#の100回制限だと思います。

> 3万文字の場合でもプロファイルでなく普通にテストする分には正常に動作する
私の環境では、Webページ上でも期待通りに動作しない(100桁に制限された数値が出力される)ようですが、うーん…。
"999..." に>859のフィルタをマッチさせると、複数回マッチして、"10000..." が幾つも出力されてしまいます。


100回以上 $SET(#=) されるのが問題なので、$SETの繰り返し回数を100回以内に収まるようにしてみました。

[Patterns]
Name = "incremented by one [Match ver] [2006/10/24] beta1.3"
Active = TRUE
Limit = 32767
Match = "(^(^[0-8]9+(^[0-9])))($LST(Num-plus))+(^[0-9])|"
"(^(^9))$SET(#=1)((^(^9))$LST(Num-plus))+(^[0-9])"
Replace = "\@"


$LST(Num-plus) は>>827に以下を追加します。


# 9 -- 512桁
9999999999...$SET(#=0000000000...)
# 9 -- 32桁 (NOT関数の桁数は 512 - 32 = 480桁)
99999999999999999999999999999999(^9999999999...)$SET(#=00000000000000000000000000000000)
# 9 -- 1桁 (NOT関数の桁数は 32 - 1 = 31桁)
9(^9999999999999999999999999999999)$SET(#=0)

865 名前:think ◆MM0nnAOCiQ mailto:sage [2006/10/24(火) 22:48:12 ID:vquh73VO0]
>864のフィルタはProxomitronのLimitの上限(32767)を考慮に入れて、繰り返し回数が百回を超えることがないように作成してあります。
この方式だと「999....90」のテキストに対して [プロファイル] では落ちますが、[テスト] では落ちません。
Webページ上でも落ちなかったので、問題ないと思われます。

>>856
> それらしきフィルターをどこかで見た。
私のサイトで配布している "Kill without <a>" (汎用Webフィルタ集の一つ) がそれです。
2chでアドバイスを受けて作成したフィルタでして、アドバイスして頂いた方がアプロダに派生系(Link to Full Path) をUPされています。
ttp://wind.prohosting.com/proxmine/cgi-bin/uploader/index.cgi?search=Link+to+Full+Path&sstart=0001&send=9999&extlist=&size_min=0&size_max=256
直接の関係はありませんが、Wikiでも同種のフィルタが公開されています。
ttp://abc.s65.xrea.com/prox/wiki/%A5%D5%A5%A3%A5%EB%A5%BF%A1%A2%A5%EA%A5%B9%A5%C8%B8%F8%B3%AB/19/

866 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/25(水) 02:29:53 ID:Gpa2YWWh0]
今思いついたけど、+1するフィルタを使えばJSなしでdat converter作れるね。
どっちが速いかはワカランけど。
どうやって計測すればいいんだろう。

867 名前:853 mailto:sage [2006/10/25(水) 02:38:09 ID:4LLBDAGk0]
自分で作ってみた
lightbox_plusベースです

[Patterns]
Name = "lightbox part1"
Active = TRUE
Limit = 256
Match = "</head>"
Replace = "<script type="text/javascript" src="Local.ptron/lightbox/spica.js"></script>\r\n"
"<script type="text/javascript" src="Local.ptron/lightbox/lightbox_plus.js"></script>\r\n"
"\r\n"
"</head>"

Name = "lightbox part2"
Active = TRUE
Limit = 256
Match = "([^>]++href=)\0$AV((([^/]+//)\1|)(\2).(jpg|gif|bmp|png)\3(.html+|)\4)"
Replace = "\0"\1\2.\3\4" rel="lightbox" "

作った後でレスに気付いた・・・orz

868 名前:816 mailto:sage [2006/10/25(水) 05:37:11 ID:ptucl50B0]
>>864
> 99999.. の後ろが 9 以外の数字で終わる場合
なるほど、\# の制限に引っかかってたのが原因でしたか、ありがとうございます。

>正常に動作する
すみません、誤解しやすい書き方でした。 これは "応答なしにならない" という意味でした。
\# の制限に引っかかるので期待した結果は返ってこないです。

>"999..." に>859のフィルタをマッチさせると、複数回マッチ
\# の制限に引っかかるとマッチングがそこで止まってしまう場合がありますね。
発生条件は分かりませんが100回を越えた時点で想定外なので調べる必要は無さそう。

>$SETの繰り返し回数を100回以内に収まるようにしてみました。
そうきましたか、すごい力技だw  これで対応出来る数字の桁数が一気に上がると。

9の繰り返しが100個以上連続するHTMLソースは見たことがないので、実用的にはこの対策は
必要無いかも知れませんね。 対策しておきたい人もいるかも知れないので好みの問題かな。

>>865
ありがとうございます、たぶんWikiで見たんだと思います。
あとサイトの更新お疲れ様でした、HTMLソースをちらっと見たんですが綺麗なソースですね。
thinkさん謹製のフィルターもありがたく使わせて頂きます。

869 名前:816 mailto:sage [2006/10/25(水) 05:46:05 ID:ptucl50B0]
>>863の補足。 test1のReplaceから $SET(A=) を削除したらタイムが2/3倍になった。
グローバル変数をこまめに解放するとかえって遅くなる。

>>867
∧_∧
( ´・ω・)  ・・・・・ドンマイ。
( つ旦O
と_)_)

870 名前:816 mailto:sage [2006/10/25(水) 10:47:42 ID:vE/VYVdH0]
> 99999.. の後ろが 9 以外の数字で終わる場合

これよく考えると \# は関係ないですね。

対象文字列が 9999....90 の場合はオミトロンのマッチングが1バイト進むごとに
999...90 の末尾までのテストを繰り返すから遅くなるようです。

他のフィルターが検索表現が 999...90 の場合でも数字の先頭から一度でマッチしまずが、
このフィルターはマッチしないので何度も数字の末尾までを行ったりきたりしてしまう。

1999...90 の場合も極端に遅くなるし間違いなさそう。( 50文字でテストし確認 )

数字の中に9を見つけたらそれ以降の数字が必ずマッチする書き方に変えたほうがいいのかな、
999... の末尾が 9 である確率は 1/10 だし、>>843と融合させる手も。



871 名前:816 mailto:sage [2006/10/25(水) 10:53:30 ID:vE/VYVdH0]
× 他のフィルターが
○ 他のフィルターは

でした。

872 名前:853 mailto:sage [2006/10/25(水) 12:19:52 ID:4LLBDAGk0]
悔しいので改良してみた。
横の□を押すと別ウィンドウで開く。


[Patterns]
Name = "lightbox_plus part1"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 256
Match = "</head>$STOP()"
Replace = "<script type="text/javascript" src="Local.ptron/lightbox/spica.js"></script>\r\n"
"<script type="text/javascript" src="Local.ptron/lightbox/lightbox_plus.js"></script>\r\n"
"\r\n"
"</head>"

Name = "lightbox_plus part2"
Active = TRUE
URL = "$TYPE(htm)"
Bounds = "$NEST(<a\s*>,</a>)"
Limit = 1024
Match = "([^>]++href=)\0$AV((([^/]+//)\1|)(\2).(jpg|gif|bmp|png)\3(.html+|)\4(target="_blank"|)\5)\6"
Replace = "\0"\1\2.\3\4" rel="lightbox" \5\6\0"\1\2.\3\4" target="_blank">□</a>"



873 名前:862 mailto:sage [2006/10/25(水) 16:10:20 ID:TjL9pAss0]
フィルターお願いします。

874 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/25(水) 16:47:46 ID:Gpa2YWWh0]
Match = "$NEST($NEST(<div\s,*class=$AV(infomation)*,>),</div)\k"
Replyace = "<!--kill-->"

クラス属性って一回しか使えない(使わない)んだっけ?
class="information"にマッチする部分を全て消すフィルタだから誤動作しても責任は持たん。
あとは自分で条件を絞って消したくないところを消さないように改良することだな。

875 名前:862 mailto:sage [2006/10/25(水) 17:27:09 ID:jr+Gvhks0]
>>874
レスありがとうございます。
初心者なので
[Patterns]
Name =
Active =
URL =
Limit =
Match = "$NEST($NEST(<div\s,*class=$AV(infomation)*,>),</div)\k"
Replace = "<!--kill-->"
後の項目もお願いします。

876 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/25(水) 18:22:52 ID:aCwuBKGn0]
>>874
classは何回でも使える。
IDは1回だけ。

877 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/25(水) 18:24:01 ID:ls2H3Cmj0]
>>874は荒らし

878 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/25(水) 18:45:32 ID:Gpa2YWWh0]
初心者かどうかなんて理由にならん。
どれだけ自分で挑戦したのか、調べたのかを書いた上で数点質問を書くのが筋じゃないのか。
実用するに当たっての情報はすでに与えられているはずなのだが。

879 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/25(水) 18:49:01 ID:VKanZiVl0]
>>862
おまえさん、以前もTV王国でフィルタうpして貰っていないか?
もしそうなら、それを元に自分で改良してみる努力をしたらどうだろう。
スレの流れを切って作業を丸投げ、うpが遅いと乞い、
同一人物のイタズラのような気がしてしまうのだが。
そうでないならスレ内を検索すれば簡単に見つかる。

880 名前:think ◆MM0nnAOCiQ mailto:sage [2006/10/25(水) 19:21:48 ID:5FqRZ3c50]
流れを断ち切るようですが…。

>>868
> ...発生条件は分かりませんが100回を越えた時点で想定外なので調べる必要は無さそう。
すみません。再度、試してみたら、1000... が一つだけ出力されました。
試すフィルタを取り違えていたのかもしれません(汗)

> すごい力技だw
ははw
実は、他に100桁以上の数値はマッチしないフィルタも作ってみたんですが、どうにもシンプルに仕上がらなかったので、結果的にあの形に収まりました。
副次効果として、32桁以上の 999.... の処理が著しく高速化します。
必要ない人は、ブロックリストの一部をコメントアウトすればいいので、管理も楽だと思います。

>>870
> マッチングが1バイト進むごとに、999...90 の末尾までのテストを繰り返すから遅くなる
あ…、確かに、

Match = "9+{1,*}(^[0-9])"

だけでも、[プロファイル] でProxomitronが落ちますね。そうすると、対処法はこんな感じかな。

[Patterns]
Name = "incremented by one [Match ver] [2006/10/25] beta2"
Active = TRUE
Limit = 32767
Match = "(^(^[0-8]9+(^[0-9])))($LST(Num-plus))+(^[0-9])|"
"(^(^9))(^$TST(Numflag=1))$SET(#=1)((^(^9))$LST(Num-plus))+"
"((^[0-9])|$SET(Numflag=1)$TST(Numflag=0))"
Replace = "$SET(Numflag=)\@"

ようやく、熟成してきた気がします。
いかがでしょう?



881 名前:think ◆MM0nnAOCiQ mailto:sage [2006/10/25(水) 19:24:36 ID:5FqRZ3c50]
ところで、話題のグローバル変数ですが、フラグを立てる(ある条件に合致したら、フラグを立て、以降フラグが立っている場合はマッチさせない)目的で使うと、高速化できることがあります。
>880のフィルタはその典型ですね。

"Charset: Set global variable", "Replace character: 2byte -> 1byte" でも使った手法で、実際これらが実用的なレベルの速度で動作するのはグローバル変数の効果が大きいと思います。
正直なところ、当初は「『全角文字 → 半角文字』の変換は1文字ずつ置換するわけだから、遅くて使いものにならないだろう」と悲観的だったのですが、これほど実用的になるとは思ってもいませんでした。
フィルタを作成依頼した人に感謝感謝です。

>>853,867,872
フィルタ作成お疲れ様です。ちょっと見てみましたが、まだ改善の余地があると思います。

---- lightbox_plus part1
</head> → (^(^</head>))
実質的な動作は変わらないのですが、$STOP() を使うなら消費しなくても良いかなと。

---- lightbox_plus part2
> Bounds = "$NEST(<a\s*>,</a>)"
$NEST と * を組み合わせると不具合が生じることがあるので、Bounds = "$NEST(<a\s[^>]+>,</a>)" にした方がよいかと思います。

> Match = "([^>]++href=)\0$AV((([^/]+//)\1|)(\2).(jpg|gif|bmp|png)\3(.html+|)\4(target="_blank"|)\5)\6"

・(target="_blank"|)\5 の場所が明らかにおかしい (属性値に入ってます)
・(\2) は括弧が要りません (正規表現とは違いますので…)
・グループ化の場所を変えれば、変数の数をもう少し減らせるかも

> Replace = "\0"\1\2.\3\4" rel="lightbox" \5\6\0"\1\2.\3\4" target="_blank">□</a>"
□などの全角文字はそのままの状態で記入すると、Shift_JISのWebページでしか作用せず、Shift_JIS以外のWebページでは文字化けを引き起こしてしまいます。
なので、ここは半角文字にするか、実体参照を用いて記述してください。
ttp://abc.s65.xrea.com/prox/wiki/TIPS/#n22f5801

882 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/25(水) 20:17:29 ID:6PSb8kEs0]
>874について訂正。
\kと$STOP()を逆に覚えていたようで、ちょうど別のフィルタを作成中にそれに気がついたので訂正。
\kではなくて$STOP()が正しい。
Match = "$NEST($NEST(<div\s,*class=$AV(infomation)*,>),</div)$STOP()"
Replyace = "<!--kill-->"

ちなみにというほどでもないが、$AV()の中身をOR関数で二つ指定してやることで>862の望む動作をすることになる。
更に、件のウェブページにこのフィルタをOR関数を使うことで二回以上呼び出すことを試みる場合には
$STOP()を発動する条件として何らかのフラグ判定が必要になるだろう。
例えばこうだ。
マッチする毎に$SET(TV=0$GET(TV))としてやる。
こうするとTV変数に詰まっている0の数から過去に何度呼び出されたかを知ることができる。
このフィルタが二度だけ呼び出されると分かっているなら($TST(TV=00)$SET(TV=)$STOP()|)とすることで
二度マッチして以降はこのフィルタをOFFにすることができる。

883 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/25(水) 20:55:25 ID:6PSb8kEs0]
相対リンク→絶対リンクに関するアイデアがある程度形になったので書き込みます。
アイデアは以下の構成。

1:現在のURLの階層を数える
$URL([^:]+:[^/]+/$SET(\0=1)([^./]+/$LST(increment)+)
\0には現在の階層数の値が入る

2:../の数を数える
((../)$LST(decrement))+
../を発見するたびに\0内の数を-1する
以上より(../)+の示す階層の深さを知ることができる

3:もう一度URLを下から辿りながら該当する階層まで上がる
$URL(
([^:]+:)\#
([^/]+/)\#$LST(decrement)$TST(\0=[^0])
(([^./]+/)\#$LST(decrement)$TST(\0=[^0]))+
)
階層を上がるたびに\0内の値を1ずつ減らし、その値が0になった時点でスタックに入っているURLが
(../)+の示す階層。
なおincrementリストとdecrementリストはそれぞれ\0に入っている一桁の数字の値を1だけ増やす又は減らすリストです。


884 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/25(水) 20:59:52 ID:6PSb8kEs0]
例)

現在のURLは
vird2002.s8.xrea.com/proxomitron/about_proxomitron.html
とします。
またhref="../download"なる相対リンクに飛びたい、という場合を考えます。

現在のURLの階層数は2です。
飛びたい先の相対リンクは../のグループを1つだけ持つので、
相対リンクの示す階層は2マイナス1から一階層目であることが分かります。
よって
vird2002.s8.xrea.com/
が../の示す階層になりますので、
downloadを付け加えて
vird2002.s8.xrea.com/downloadがこの場合の相対リンクの示す絶対リンクです。

885 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/25(水) 21:03:10 ID:6PSb8kEs0]
訂正。
incrementリスト/decrementリストは必ずしも一桁の数字を対象にはしません。
このリストを構成するに当たっては↑で議論されているフィルタを利用させていただくことになると思います。

886 名前:think ◆MM0nnAOCiQ mailto:sage [2006/10/25(水) 23:05:08 ID:5FqRZ3c50]
ふぅ…、出来ました。フィルタ作りとは全く関係ないところで躓いていましたw

[Patterns]
Name = "ImagePopup lightbox_plus.js (1/2) [2006/10/25]"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 8
Match = "(^(^</head>))$STOP()"
Replace = "\t<link href='local.ptron/lightbox_plus/lightbox.css' charset='utf-8' type='text/css'>\r\n"
"\t<script type="text/javascript" charset="utf-8" src="local.ptron/lightbox_plus/spica.js"></script>\r\n"
"\t<script type="text/javascript" charset="utf-8" src="local.ptron/lightbox_plus/lightbox_plus.js"></script>\r\n"

Name = "ImagePopup lightbox_plus.js (2/2) [2006/10/25]"
Active = TRUE
URL = "$TYPE(htm)"
Bounds = "$NEST(<a\s,</a>)"
Limit = 1024
Match = "([^>]++(\shref=$AV([^?#]++.(jpeg|jp[eg]|gif|png|bmp|ico|j2k)([?#]*|)))\1((^target=$AV(_blank))[^>])+)\#"
"(target=$AV(_blank)([^>]+)\#|) \0"
Replace = "\@ rel="lightbox"\0 <a\1><img></a>"

多分、これで>853氏の要望は全て満たせると思います。(少し私の好みが入っているので、気に入らない点は適宜改変してください。)
作ってから気がついたんですが、target="_blank" を消さなくても lightbox_plus は動作するんですね。(Wikiには target="_blank" が存在すると動作しないとありました)
アクセシビリティの観点から、target="_blank" を敬遠する方もいると思いますので、とりあえずはこれで良しとします。

887 名前:think ◆MM0nnAOCiQ mailto:sage [2006/10/25(水) 23:11:51 ID:5FqRZ3c50]
>886のフィルタについて。

lightbox_plus.js で指定されている画像ファイルのパスを書き直さなければならない点に注意して下さい。
該当箇所は "Event.register(window,"load",function() {" 以下にある記述です。
# 例) 'loading.gif' を 'local.ptron/lightbox_plus/loading.gif' にする。
これに気がつくのに、ずいぶんと時間を消費しました…。

(^(^</head>)) を使用したのは、消費しない事による高速化の狙いもありますが、</head> に複数のフィルタがマッチできるようにするためでもあります。
「消費しない」ということは何度でもマッチできるということですので、もう一度、他のフィルタで </head> にマッチさせることが出来ます。
Multiを使用せずに、同様の効果を得られるのが利点です。
(実は、私の作ったフィルタで </head> にマッチするものがあるので、消費すると個人的に拙いのです…。)

>>883-885
考察お疲れ様です。

> ../を発見するたびに\0内の数を-1する
私も同じ事を考えていました。インクリメント(+1) と デクリメント(-1) が必要ですよね。

一つ気になったのは置換スタックを使用している点です。
もし、>880ベースのフィルタを使うとしたら、既に使用されている置換スタックは使えません。
# 816氏のフィルタベースならバッティングしませんが、遅いとのことなので…。
どちらかのフィルタの置換スタックをグローバル変数に代替えするか、置換スタックを使わないアルゴリズムを考える必要がありますね。
>883は単純にグループ化して、ローカル変数に格納すれば良いような気もしますが、未検証のため自信なし…。

888 名前:think ◆MM0nnAOCiQ mailto:sage [2006/10/25(水) 23:20:54 ID:5FqRZ3c50]
ごめんなさい。>886で少しミスしました。
2chで実体参照が有効なのを忘れて、そのまま投稿してしまいました。
下記が修正版になります。
お手数ですが、>886を適用された方は (2/2) だけ↓を取り込んでください。
# (1/2) は変わりありません。

[Patterns]
Name = "ImagePopup lightbox_plus.js (1/2) [2006/10/25]"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 8
Match = "(^(^</head>))$STOP()"
Replace = "\t<link href='local.ptron/lightbox_plus/lightbox.css' charset='utf-8' type='text/css'>\r\n"
"\t<script type="text/javascript" charset="utf-8" src="local.ptron/lightbox_plus/spica.js"></script>\r\n"
"\t<script type="text/javascript" charset="utf-8" src="local.ptron/lightbox_plus/lightbox_plus.js"></script>\r\n"

Name = "ImagePopup lightbox_plus.js (2/2) [2006/10/25] fixed"
Active = TRUE
URL = "$TYPE(htm)"
Bounds = "$NEST(<a\s,</a>)"
Limit = 1024
Match = "([^>]++(\shref=$AV([^?#]++.(jpeg|jp[eg]|gif|png|bmp|ico|j2k)([?#]*|)))\1((^target=$AV(_blank))[^>])+)\#"
"(target=$AV(_blank)([^>]+)\#|) \0"
Replace = "\@ rel="lightbox"\0 <a\1>&lt;img&gt;</a>"

889 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/26(木) 00:03:47 ID:4hgUqkpN0]
3:もう一度URLを下から辿りながら該当する階層まで上がる
$URL(
([^:]+:)\#
([^/]+/)\#$LST(decrement)$TST(\0=[^0])
(([^./]+/)\#$LST(decrement)$TST(\0=[^0]))+
)

を置換スタックを用いないアルゴリズに修正するのは非常に簡単です。
むしろシンプルさの点でこちらのほうを先に考慮するべきでした。
$URL(
(
([^:]+:)
([^/]+/)$LST(decrement)$TST(\0=[^0])
(([^./]+/)$LST(decrement)$TST(\0=[^0]))+
)\1
)

$TSTとグループ化については検証しました。
マッチ欄 = "(((?)\0$TST(\0=[^0]))+)\1"
1文字読む毎にその文字が0でないかどうかをTESTし、最後の0までを\1に収めます。

890 名前:883 mailto:sage [2006/10/26(木) 00:05:45 ID:4hgUqkpN0]
IDが頻繁に変わりますが>883-885です。



891 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/26(木) 02:31:16 ID:VSM6AvXD0]
改良ありがとうございます。
というか全面的に書いて頂いちゃいましたね。
自分で書いたものを直してもらうと勉強になります。

892 名前:816 mailto:sage [2006/10/26(木) 06:45:53 ID:XApi7DgO0]
>>880-881
乙です。 フラグを使って二回目以降のマッチングをキャンセルさせたんですね、早速プロファイルで
テストしたらバッチリでした。 グローバル変数を使うことで若干の速度低下はありますが安心して
使えるのでこちらのほうがいいですね、GJ。

自分も何通りかの回避策を考えていたんですが今までに出たフィルターより酷いものしか思い付かず
全部ボツになりました。 一番有力だったのが>>851のフィルターに分岐をもう1つ付けた↓の案です。

(^(^[0-8]9+(^[0-9])))$LST(Num-plus)(9$SET(#=0))+
|
(^(^9))$SET(#=1)(9$SET(#=0))+(^[0-9])
|
(9+{1,*})\0

マッチングが3つ目の分岐に来る時は対象の数字が  "999....9[0-8]"  (←0〜8のどれか) ...のはずなので、
"999..." の部分を単独で消費させ、次のマッチングテストを [0-8] のところから再開させようという狙いでした。

しかしマッチ回数が増えると返って遅くなったりデバックモードが見づらくなるなどの副作用が激しい上に
\0 か \@ のどちらを出力するかのフラグも必要になるので諦めました。

>全角文字 → 半角文字
グローバル変数も使い方次第ですね、とても参考になりました。

>>883
乙。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<373KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef