uzullaがブログ

uzullaがブログです。

preg_matchの挙動がなんかへん、というか、PCREか?

preg_matchに限った話しじゃないのかもしれないが(多分、PCREの問題だと思うんだが)

preg_match('/\A[[:^cntrl:]]{0,128}\z/u', 'テキスト');

こんな感じのコードを書いていて、マッチがおかしい環境があるっぽい。
このコードはどこにのっているかというと、徳丸本である(http://www.amazon.co.jp/%E4%BD%93%E7%B3%BB%E7%9A%84%E3%81%AB%E5%AD%A6%E3%81%B6-%E5%AE%89%E5%85%A8%E3%81%AAWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9-%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%8C%E7%94%9F%E3%81%BE%E3%82%8C%E3%82%8B%E5%8E%9F%E7%90%86%E3%81%A8%E5%AF%BE%E7%AD%96%E3%81%AE%E5%AE%9F%E8%B7%B5-%E5%BE%B3%E4%B8%B8-%E6%B5%A9/dp/4797361190 のP83)。


ちなみに

preg_match('/\A[^[:cntrl:]]{0,128}\z/u', 'テキスト');

これは思惑通りに動く。(これは意味として、等価だとおもっているが、間違ってたらアレだな)


環境を簡単に書くと、通らない環境は
PHP 5.3.3 (cli)
PCRE Library Version => 6.6 06-Feb-2006

通る環境は
PHP 5.3.1 (cli)
PCRE Library Version => 7.9 2009-04-11

って感じ。


また、

preg_match('/\A[[:^cntrl:]]{0,128}\z/', 'テキスト');

上記のように、u パターン指示子(utf-8指定のアレ)をはずしても動く(正しく動いてるかはあんまり検証してないが)。

余談だが

:^cntrl: って :print:って書けるんじゃないのっておもったんだけど、どうなのかな…。


なんかロケールの気もしてきた

問題がおこったサーバーは、fgetscsv()もなんかおかしかったし…。