正規表現地獄

SQL文をPHPの正規表現関数を使って書き換える。この正規表現がなかなかうまくかけなくてハマッタ。

元のクエリの対象部分はこんな感じ。

hoge LIKE ‘%bar%’ AND fuga LIKE ‘%www%’

お題は、ANDの前の部分( hoge LIKE ‘%bar%’) を捕まえて、以下のようにしたい。もちろんbar や wwwは不定。

(SELECT id FROM xxx WHERE hoge LIKE ‘%bar%’) AND fuga LIKE ‘%www%’

そこで、最初書いたパターンがこれ。

“hoge LIKE ‘%.*%’”

確かに最初はうまく動いているかに見えたんだけど、これだと、最初のお題の文章全体がヒットしちゃうのね。つまり、hoge LIKE ‘% の % から始まって、 www%’ の %までが 「.*」で表現されていることになる。結局お題の文章全体がヒットしてしまい、期待通りではないことが判明。 Continue reading

日本語のspamメールが大量に…(3)(とりあえず解決)

昨日に続き、大量のspamメールの対処。

昨日のbody_checksの効果は全くなかった。理由は、これれで出力して正規表現で一致させようとしていた箇所が全くでたらめだったという事。

echo -n ¥”洗練された英文ライティングを実現!¥” | nkf -MB >> /etc/postfix/body_checks

昨日の時点では、手元にサンプルがなかったんだけど、今日はこの時間にサーバに入って、クライアントがPOP3で受信する前のファイルを手元にもってきて解析。ふぅっ。
で、見てみると、こんな感じになっていて、昨日やった事が間違っていた事が判明。

=1B$B@vN}$5$l$?1QJ8%i%$%F%#%s%0$r<B8=3D=1B(B!
=1B$BC1D4$JJ8>O$b!”0l=3DV$G@vN}$5$l$?1QJ8$K!*=1B(B
=1B$BJ8K!!”%9%Z%k!”6gFIE@$N%A%’%C%/$K2C$(!”=1B(B =

では今日得られたこの文字列、どうやって正規表現で表すんだ?

$(ドルマーク)とか厄介だなぁ。。。

オンラインで、JavaScriptで動いているような正規表現確認サイトってないかなぁ、、、って探してみると、やっぱりあるね。REJAX – Easiest Regular Expression Tester. Ever. ナイス!!

Language にPHP 5 POSIXを選択して、Subjectに、「=1B$B@vN}$5$l$?1QJ8%i%$%F%#%s%0$r<B8=3D=1B(B!」とかをペースト。んでもって、patternを組み立てていくと、下のResultsのところに、赤く選択された文字列がパターンに一致した箇所だと示してくれる。

でここまで来て困ったので、やっぱり$とか} とか。。。。 orz

正規表現をちゃんと調べればいいんだろうけど、とりあえず知っていた知識として、 . (ドット)が何か1文字を表すということ。$とか特殊な文字を全部 . のパターンにしちゃえばいいってことだ。それで出来たのがこれ。

=1B.B@vN}.5.l..1QJ8%i%.%F%#%s%0.r<B8=3D=1B.B!

これを持って、body_checksを以下のようにしてやれば、バシバシはじいてくれるじゃない。

/=1B.B@vN}.5.l..1QJ8%i%.%F%#%s%0.r<B8=3D=1B.B!/      REJECT

でログを眺めながら、REJECTされているのを確認していて、ふと思った。これまでの大量のメールをREJECTしたらどうなるか。。。所詮FROMのアドレスは適当だから、送り返されても困るだろう。
ということで、REJECTをやめて、DISCARD。これなら、受信したように見せかけてそのまま廃棄。

でこれの問題は、body_checksに使った文章が変更された時。また本文を拾ってきて同じような作業を行わなければならない。
だが、今夜は気持ちよく寝られそうだ。