人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPのpreg_matchで日本語を扱う際についての質問です。
下記のようなコードを書きました。
これは文字エンコードがUTF8かつ指定の正規表現にマッチした場合のみtrueを返す関数です。

public static function name($str)
{
if(mb_check_encoding($str, 'UTF-8') && preg_match('/\A[[:^cntrl:]]{1,10}\z/u', $str) == 1)
{
return true;
}else{
return false;
}
}

この場合「aaaaa」はtrue、「aaaaaa\naaa」はfalseと期待通りの結果なのですが、
「あ」はfalse、「ああああ\nああ」もfalseと日本語の場合正しく動作しません。

この関数で実現したいことは日本語を含め、1?10文字以内で制御文字が使われていない場合のみマッチすることです。

どのようにすれば期待した結果が得られるものになるでしょうか。
よろしくお願いします。

●質問者: after_333sec
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● うぃんど
●50ポイント

ソースコードをsjisなどで保存してしまっているのではないですか?
下記のようなコードをutf-8(改行はLF)で保存して実行してみましたが成功しますよ。

<?php
class A
{
 public static function name($str)
 {
 if(mb_check_encoding($str, 'UTF-8') && preg_match('/\A[[:^cntrl:]]{1,10}\z/u', $str) == 1)
 {
 return true;
 }else{
 return false;
 }
 }
}

$a = new A();

echo '1:' . $a->name('aaaa') . "\n";
echo '2:' . $a->name("aaaa\naaaaa") . "\n";
echo '3:' . $a->name('ああああ') . "\n";
echo '4:' . $a->name("ああああ\nあああああ") . "\n";

結果

1:1
2:
3:1
4:

after_333secさんのコメント
コードもUTF8で保存しています。 ご回答のコードで試しましたが結果が異なりました。

2 ● pretaroe
●50ポイント

http://uzulla.hateblo.jp/entry/2011/11/15/050513

こちらと現象が似てますので
環境依存なのかもしれません。

バージョンによって
回答1さんのように動作したり、質問主のように動作したりするのでは?


after_333secさんのコメント
非常に役に立ちました。 恐らく環境依存ですね。 [[:^cntrl:]]を[^[:cntrl:]]にしたところ期待通りの結果が得られました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ