以下のようなテキスト型リンクの広告を削除するProxomitron用フィルタを作成してみましょう。
Webページサンプル[PR] 100円からご希望のフィルタをお作りします!
・・・・・・・。
大変魅力的なお誘いですが、自分で作った方がお安くつきますね(^^;
ここは タダ でこの広告を消す事に挑戦してみましょう。
広告を消すためには、htmlソースから該当タグを見つけなければなりません。
まず、上の広告のリンクを [右クリック -> リンクのコピー] をして下さい。
(この作業で http://sample.adserver.co.jp/
がクリップボードへコピーされます。)
次に、ページ内の任意の場所で [右クリック -> ソースの表示] もしくは、ブラウザのメニューより [表示 -> ソースの表示] でhtmlソースを開きます。
<?xml
version=
'1.0'
encoding='utf-8'
?>
<!DOCTYPE
html PUBLIC
'-//W3C//DTD XHTML 1.0 Strict//EN'
'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
>
<html
lang=
'ja'
xml:lang='ja'
xmlns='http://www.w3.org/1999/xhtml'
>
<head>
...
初めて見た人には意味不明だと思いますが、これがWebページを構成するHTML言語のソースです。
(厳密には上記はXHTMLですが、細かいことは置いておきます。)
この中から広告を表す記述を探して、広告を表示しないようにhtmlソースを書き換えるのが今回のProxomitronの仕事です。
htmlソースを開いたテキストエディタをの検索機能を使って、先程クリップボードへコピーした http://sample.adserver.co.jp/
で検索してみて下さい。
以下のhtmlソースが見つかると思います。
<pre
class=
'htmlsrc_prx'
>
<a
href=
'http://sample.adserver.co.jp/'
>
[PR] 100円からご希望のフィルタをお作りします!</a>
</pre>
上の記述を読み解くためにはHTMLタグについて理解しておく必要がありますが、今回は必要な部分だけ解説します。
広告のリンクを貼っているのはa要素です。
a要素は開始タグと終了タグで括るタイプの要素であり、括られた部分にリンクを貼ります。
従って、<a href='http://sample.adserver.co.jp/'>...</a>
を削除すれば広告はなくなります。
さて、マッチさせたい文字列は見つけたわけですが、その後にどの文字列を中心にマッチさせるべきかを考えなければなりません。
もちろん、対象の文字列をそのまま書き出してマッチさせる手もありますが、それでは1つの広告を消せても、他の場所の広告を消せません。
できるだけ多くの広告を消せるように、表現を考える必要があります。
ポイントは ユニークな文字列 を見つけることです。
ユニークな文字列とは特徴的な文字列、この場合は、「広告を表す基盤となる文字列」を差します。
何をおいてもこれさえ見れば広告と読み取れる文字列を見つければいいのです。
では、「ユニークな文字列」には何があるでしょうか。
まず、a要素 はユニークです。
a要素を見ればアンカーの貼られている文字列だけに制限できます。
次に、a要素にあるhref属性値に記述されているURLもユニークな文字列の1つです。
Webサイト作成者はコンテンツを長く保つためにも、URLを変えることを嫌います。
URLを変えると、そのURLにリンクされている全てのページのソースを見直さなければならず、その点検作業が大変なものとなるからです。
「URL, ファイルパス」を示す属性値にマッチさせるのは賢い方法です。
以上を踏まえて検索表現(Match欄)を作成していくわけですが、今回はメタキャラクタ,マッチングコマンドを使っているので、以前と比べて難しく感じると思います。
順を追って説明していきますので、頑張って追いかけてください。
<a\s
a要素に制限するため、<a
と記述します。
a要素にはhref属性が指定されているため、<a
となる事は確実です。
...href=
ですので、半角スペースを保証する \s を追記します。
<a\s[^>]++href=
次にhref属性まで消費しなければならないわけですが、href属性はa要素の内に収まっていなければなりません。
href属性は <a
で始まって、>
で終わる文字列の中に存在しなければならないわけです。
そのために、[^>]++
を使います。
[^>]
は文字クラスを用いており、「> ではない1文字」を示します。
そして、++ は後ろをみながら直前の文字を繰り返します。
href=
が後ろにくるまで、「> ではない1文字」を繰り返すこととなり、href属性がa要素の内にあることを保証できます。
最後に、前後の空白を吸収してくれるメタキャラクタ = を追記します。
<a\s[^>]++href=$AV(http://sample.adserver.co.jp/)
$AV はクオートの有無に関わらず、属性値にマッチしてくれるマッチングコマンドです。
上のように書けば、
href='http://sample.adserver.co.jp/'
href='http://sample.adserver.co.jp/'
href=http://sample.adserver.co.jp/
のいずれにもマッチできます。
URLと違って、クオートの修正はあり得ることですので、その時に備えて $AV を使用しておくのは良いことだと思います。
$NEST(<a\s[^>]++href=$AV(http://sample.adserver.co.jp/),</a>)
$NEST は 開始タグ, 終了タグ にマッチさせるためのマッチングコマンドです。
a要素 は 開始タグ, 終了タグ を内包しているので、$NEST を利用できます。
開始タグに相当する記述は前回のステップで書き終わったので、$NEST の start match にそれを記述します。
(開始タグを最後まで記述していませんが、$NEST は開始タグの後半の文字列を省いても動作するため、省略しています。)
次に inner match ですが、今回は中要素にユニークな文字列がないので省略します。
最後に、終了タグの </a>
を記述すれば検索表現(Match欄)の完成です。
仕上げに、フィルタ名, URL欄 を埋めます。
以下は完成したフィルタをエクスポートしたものです。
[Patterns] Name = "Kill <a> ad" Active = TRUE URL = "$TYPE(htm)" Limit = 256 Match = "$NEST(<a\s[^>]++href=$AV(http://sample.adserver.co.jp/),</a>)"
URL欄に初めてみるマッチングコマンドがありますね。
$TYPE はページタイプを制限するものです。
$TYPE(htm) と書くことで、「Webページ」に制限することができます。
CSS ですとか JavaScript ですとか...そういう別種のページにマッチすることを防いでくれるんですね。
慣れると頻繁に使うマッチングコマンドですので、これも覚えてしまってください。
Replace欄に何も書かれていない事は不思議に思われるかもしれません。
ProxomitronはマッチしたテキストをReplace欄に書かれている記述にそって置換します。
Replace欄に何も書かれていなければ置換テキストが見つからず、結果として削除される事になるのです。
今回は広告を消す事を目的としていたので、綺麗に削除するようにしてみました。
慣れてくると、htmlソースに削除した痕跡が残るようにコメントを残すなどの工夫がほしくなりますが、それはまた別の機会にしましょう。
それでは、最終チェックです。
広告を含むhtmlソース(htmlソース2) をテストウインドウの <テストするHTMLを入力> と書かれている欄に記述して、テストしてみてください。
テストで該当部分が削除されることを確かめてから、ブラウザでこのページを更新してください。
ちゃんと消えましたよね?