<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>DOOM! DOOMER!! DOOMEST!? &#187; 正規表現</title>
	<atom:link href="http://g-taki.com/wordpress/tag/%e6%ad%a3%e8%a6%8f%e8%a1%a8%e7%8f%be/feed" rel="self" type="application/rss+xml" />
	<link>http://g-taki.com/wordpress</link>
	<description>日刊　カリブNow!!</description>
	<lastBuildDate>Mon, 06 Sep 2010 02:33:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://g-taki.com/wordpress/tag/%e6%ad%a3%e8%a6%8f%e8%a1%a8%e7%8f%be/feed" />
		<item>
		<title>正規表現地獄</title>
		<link>http://g-taki.com/wordpress/web/1441.html</link>
		<comments>http://g-taki.com/wordpress/web/1441.html#comments</comments>
		<pubDate>Fri, 13 Mar 2009 16:25:25 +0000</pubDate>
		<dc:creator>g_taki</dc:creator>
				<category><![CDATA[PC]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[最短一致]]></category>
		<category><![CDATA[正規表現]]></category>

		<guid isPermaLink="false">http://g-taki.com/wordpress/?p=1441</guid>
		<description><![CDATA[SQL文をPHPの正規表現関数を使って書き換える。この正規表現がなかなかうまくかけなくてハマッタ。
元のクエリの対象部分はこんな感じ。
hoge LIKE &#8216;%bar%&#8217; AND fuga LIK &#8230; <a href="http://g-taki.com/wordpress/web/1441.html">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>SQL文をPHPの正規表現関数を使って書き換える。この正規表現がなかなかうまくかけなくてハマッタ。</p>
<p>元のクエリの対象部分はこんな感じ。</p>
<blockquote><p>hoge LIKE &#8216;%bar%&#8217; AND fuga LIKE &#8216;%www%&#8217;</p></blockquote>
<p>お題は、ANDの前の部分( hoge LIKE &#8216;%bar%&#8217;) を捕まえて、以下のようにしたい。もちろんbar や wwwは不定。</p>
<blockquote><p>(SELECT id FROM xxx WHERE hoge LIKE &#8216;%bar%&#8217;) AND fuga LIKE &#8216;%www%&#8217;</p></blockquote>
<p>そこで、最初書いたパターンがこれ。</p>
<blockquote><p>&#8220;hoge LIKE &#8216;%.*%&#8217;&#8221;</p></blockquote>
<p>確かに最初はうまく動いているかに見えたんだけど、これだと、最初のお題の文章全体がヒットしちゃうのね。つまり、hoge LIKE &#8216;% の % から始まって、 www%&#8217; の %までが 「.*」で表現されていることになる。結局お題の文章全体がヒットしてしまい、期待通りではないことが判明。<span id="more-1441"></span>これを最長一致というのね。ってことは俺がやりたいのは、最短一致だな。mb_ereg_replace を使うと第4引数で s を指定すると最短一致になるらしいが、できれば正規表現で済ませたいので、もう一踏ん張り。</p>
<p>ここでポイントは、&#8217;%bar%&#8217; の最初の % でヒットしたら、次の%が出たらもう区切りの場所が近いということだから、「%以外の0文字以上で、最後に%がある」　って考えればよいとうこと。</p>
<blockquote><p>&#8220;hoge LIKE &#8216;%[^%]*%&#8217;&#8221;</p></blockquote>
<p>これがなかなか思いつかないもので、たっぷり2時間悩んだ。週末で、昨日から寝不足だったけど、気持ちよく週末を迎えるためにはなんとしてもクリアしておきたい箇所だった。</p>
<p>最終的には、以下のような感じでanswer が得られた。</p>
<blockquote><p>$string = &#8221; hoge LIKE &#8216;%bar%&#8217; AND fuga LIKE &#8216;%www%&#8217; &#8220;;<br />
$pattern = &#8220;hoge LIKE &#8216;%[^%]*%&#8217;&#8221;;<br />
$replacement = &#8216;(SELECT id FROM xxx WHERE \\0)&#8217;;<br />
$answer = ereg_replace($pattern, $replacement, $string);</p></blockquote>
<p>今回も大助かりの、<a href="http://www.projects.aphexcreations.net/rejax/" target="_blank">ReJax  Easiest Regular Expression Tester. Ever.</a> このサイトを知らなかったら、あきらめて寝るが、落ち着かない週末になるところだった。</p>
<p>天気は金曜日から雨だけど、なにやらすごく気分がいいぞ？！</p>
<p>一杯ヒッカケテ寝ますかね。</p>
]]></content:encoded>
			<wfw:commentRss>http://g-taki.com/wordpress/web/1441.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://g-taki.com/wordpress/web/1441.html" />
	</item>
		<item>
		<title>日本語のspamメールが大量に…(3)(とりあえず解決)</title>
		<link>http://g-taki.com/wordpress/web/955.html</link>
		<comments>http://g-taki.com/wordpress/web/955.html#comments</comments>
		<pubDate>Wed, 21 Jan 2009 14:47:25 +0000</pubDate>
		<dc:creator>g_taki</dc:creator>
				<category><![CDATA[PC]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[postfix]]></category>
		<category><![CDATA[spam]]></category>
		<category><![CDATA[正規表現]]></category>

		<guid isPermaLink="false">http://g-taki.com/wordpress/?p=955</guid>
		<description><![CDATA[昨日に続き、大量のspamメールの対処。
昨日のbody_checksの効果は全くなかった。理由は、これれで出力して正規表現で一致させようとしていた箇所が全くでたらめだったという事。
echo -n ¥”洗練された英文ラ &#8230; <a href="http://g-taki.com/wordpress/web/955.html">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>昨日に続き、大量のspamメールの対処。</p>
<p>昨日のbody_checksの効果は全くなかった。理由は、これれで出力して正規表現で一致させようとしていた箇所が全くでたらめだったという事。</p>
<blockquote><p>echo -n ¥”洗練された英文ライティングを実現!¥” | nkf -MB &gt;&gt; /etc/postfix/body_checks</p>
</blockquote>
<p>昨日の時点では、手元にサンプルがなかったんだけど、今日はこの時間にサーバに入って、クライアントがPOP3で受信する前のファイルを手元にもってきて解析。ふぅっ。<br />
 で、見てみると、こんな感じになっていて、昨日やった事が間違っていた事が判明。</p>
<blockquote><p>=1B$B@vN}$5$l$?1QJ8%i%$%F%#%s%0$r&lt;B8=3D=1B(B!<br />
 =1B$BC1D4$JJ8&gt;O$b!&#8221;0l=3DV$G@vN}$5$l$?1QJ8$K!*=1B(B<br />
 =1B$BJ8K!!&#8221;%9%Z%k!&#8221;6gFIE@$N%A%&#8217;%C%/$K2C$(!&#8221;=1B(B =</p>
</blockquote>
<p>では今日得られたこの文字列、どうやって正規表現で表すんだ？</p>
<p>$(ドルマーク)とか厄介だなぁ。。。</p>
<p>オンラインで、JavaScriptで動いているような正規表現確認サイトってないかなぁ、、、って探してみると、やっぱりあるね。<a href="http://www.projects.aphexcreations.net/rejax/" target="_blank">REJAX &#8211; Easiest Regular Expression Tester. Ever.</a> ナイス！！</p>
<p>Language にPHP 5 POSIXを選択して、Subjectに、「=1B$B@vN}$5$l$?1QJ8%i%$%F%#%s%0$r&lt;B8=3D=1B(B!」とかをペースト。んでもって、patternを組み立てていくと、下のResultsのところに、赤く選択された文字列がパターンに一致した箇所だと示してくれる。</p>
<p>でここまで来て困ったので、やっぱり$とか} とか。。。。 orz</p>
<p>正規表現をちゃんと調べればいいんだろうけど、とりあえず知っていた知識として、 . (ドット)が何か１文字を表すということ。$とか特殊な文字を全部 .　のパターンにしちゃえばいいってことだ。それで出来たのがこれ。</p>
<blockquote><p>=1B.B@vN}.5.l..1QJ8%i%.%F%#%s%0.r&lt;B8=3D=1B.B!</p>
</blockquote>
<p>これを持って、body_checksを以下のようにしてやれば、バシバシはじいてくれるじゃない。</p>
<blockquote><p>/=1B.B@vN}.5.l..1QJ8%i%.%F%#%s%0.r&lt;B8=3D=1B.B!/      REJECT</p>
</blockquote>
<p>でログを眺めながら、REJECTされているのを確認していて、ふと思った。これまでの大量のメールをREJECTしたらどうなるか。。。所詮FROMのアドレスは適当だから、送り返されても困るだろう。<br />
 ということで、REJECTをやめて、DISCARD。これなら、受信したように見せかけてそのまま廃棄。</p>
<p>でこれの問題は、body_checksに使った文章が変更された時。また本文を拾ってきて同じような作業を行わなければならない。<br />
 だが、今夜は気持ちよく寝られそうだ。</p>
]]></content:encoded>
			<wfw:commentRss>http://g-taki.com/wordpress/web/955.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://g-taki.com/wordpress/web/955.html" />
	</item>
	</channel>
</rss>
