PHPのpreg関数で、日本語を含む文字列に対してのマッチングに失敗。(PHP5.2.3; OSX[intel]; UTF-8)
var_dump(preg_replace('|([^\w\-\.\~\!\$\&\'\(\)\*\+\,\;\=\:\%\@\/\?]+)|e', '"<\1>"', 'あいうえお_09')); var_dump(preg_replace('|([^\a-zA-Z0-9\_\-\.\~\!\$\&\'\(\)\*\+\,\;\=\:\%\@\/\?]+)|e', '"<\1>"', 'あいうえお_09'));
string(15) "<あいうえ⚤最琀㬀ꨀ_09" string(15) "<あいうえお>_09"
しばらく悩み続けましたが、どうやら文字クラス内で英数字(単語構成文字)の略記法を使っていた事が原因のようです。正規表現を「とりあえず使える」程度のままだましだまし使っている事が露呈しました。
略記法は文字クラス内で使ってはいけないんでしたっけ?[\w]=[a-zA-Z0-9_]という理解でここまでやっていたように思います。それで、過去に[\w]でうまくいかなかった経験があって、[a-zA-Z0-9_]を使い続けてきた気がします。調子に乗って\wなんか使おうとしたのがまずかった。
「文字クラス内に文字クラス(略記法)を書いた場合にどうなるか」を理解できていなかったようです。そもそも、単語構成文字(\w)の意味すらよくわかっていない事に気がつきました。ロケール情報で内容が変わるんですね。
とにかく、急ぎめで正規表現について調べておこうと思います。
本だけはあるんだよなぁ。

