PHP preg_matchで中括弧が引っかからない。

PHP

PHPの正規表現関数の中で一番早いpreg_matchが思い通り動かない。

以下のコードで中括弧が無かったら、trueを出したいのだが、無くてもtrueが出ちゃう。

preg_match('/[^{}]+/','紙');

コメント

  1. より:

    これだと中括弧以外が1文字でもあったらtrue

    中括弧があったらfalseにしたいなら
    preg_match(‘/^[^{}]+$/’,’紙’);
    かな

  2. Yuki Matsukura より:

    こんな過去の記事にコメントありがとうございます。

    今見てみると、本文のコードよくわからないですね。

    当時のコードと実行環境は残っていないので推測ですが、「紙」のUTF8のバイト列と「{」のバイト列を比較した際に、「{」のバイト列が「紙」のバイト列に含まれている。

    よって、PHPの正規表現で「紙」が「{」にマッチしてしまう事を書きたかった記事だと思います。

    手元の環境で試してみましたが、再現しませんでした。

    < ?php
    // save as UTF-8
    print bin2hex('紙');
    print  "\n";
    print bin2hex('{');
    print  "\n";
    
    // expected 0
    preg_match('/\{/', '紙') ? print 1 : print 0;