(致命的かも)正規表現の文字クラスと略記法とマルチバイト文字の関係を理解してなかったっぽい

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)の意味すらよくわかっていない事に気がつきました。ロケール情報で内容が変わるんですね。

とにかく、急ぎめで正規表現について調べておこうと思います。


本だけはあるんだよなぁ。

プロフィール

このブログ記事について

このページは、koshigoeが2007年9月 8日 03:54に書いたブログ記事です。

ひとつ前のブログ記事は「PHPUnit3のエラー出力がすてき」です。

次のブログ記事は「フィードの3つの状態を定義する仕様を知った(ページネーションとか)」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。