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文字以内で制御文字が使われていない場合のみマッチすることです。

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

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/05/06 12:58:32
  • 終了:2012/05/06 15:40:38

回答(2件)

id:windofjuly No.1

うぃんど回答回数2625ベストアンサー獲得回数11492012/05/06 14:23:53

ポイント50pt

ソースコードを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:
id:after_333sec

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

2012/05/06 15:41:31
id:pretaroe No.2

pretaroe回答回数531ベストアンサー獲得回数752012/05/06 15:07:54

ポイント50pt

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

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

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

id:after_333sec

非常に役に立ちました。
恐らく環境依存ですね。

:^cntrl:?を[^[:cntrl:にしたところ期待通りの結果が得られました。

2012/05/06 15:42:56

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません