正規表現「\w」の説明の訂正(レシピ045)

レシピ045 正規表現によるパターンマッチをしたい(P.117~)の「正規表現の基本的な構文」の説明に不正確な記述がありましたので訂正と補足いたします。

「\w」について「アルファベット、数字、アンダースコア」と説明してありますが、この「\w」はロケールの影響を受けるため英語のアルファベット「a~z」「A~Z」以外の文字がマッチする可能性があります。

「\w」の説明としては「単語構成文字」が正しい説明となります。単語を構成する文字にはマッチするということであり、何が単語構成文字になるかは、PHPのバージョンおよびプラットフォームで違う可能性がありますので、ご注意ください。

PCREでは、PHP 5.3.4以降、全角ひらがななども単語構成文字に該当するよう変更されています。

var_dump(preg_match('/\w/u', 'あ'));

の結果は「int(1)」になります(Windowsを除く)。なお、mb_ereg()関数では以前のバージョンから全角ひらがななども単語構成文字に該当しています。

また、全角スペースは、mb_ereg()関数では単語構成文字に該当しますが、PCREでは単語構成文字には該当しません。

var_dump(mb_ereg('\w', ' '))

の結果は「int(1)」になります。

このように「\w」の動作は複雑であり、使用しないことをおすすめいたします。とくに

[a-zA-Z0-9_]

を短くしようと「\w」に置き換えることは絶対にしないことをおすすめします。

kenji posted at 2011-9-21 Category: 追加情報

Trackback URL