PHPで使用できるマルチバイトの「preg」関数はありません。つまり、デフォルトのpreg_functionsはすべてmbセーフです。 PHPのドキュメントに言及が見つかりませんでした。
PCREはUTF-8およびその他のUnicodeエンコーディングをサポートできますが、コンパイル時に指定する必要があります。 PCRE8.0のmanページ から:
PCREの現在の実装は、UTF-8でエンコードされた文字列とUnicodeの一般的なカテゴリプロパティのサポートを含め、Perl5.10にほぼ対応しています。ただし、UTF-8とUnicodeのサポートは明示的に有効にする必要があります。これはデフォルトではありません。 UnicodeテーブルはUnicodeリリース5.1に対応しています。
PHPは現在 PCRE 7.9 ;システムのバージョンが古い可能性があります。
PHP 5.2に付属している PCRE lib を見ると、UnicodeプロパティとUTF-8をサポートするように構成されているようです。 5.3ブランチ 。
pcreはすぐに使用できるutf8をサポートしています。「u」修飾子のドキュメントを参照してください。
イラスト(\ xC3\xA4はドイツ語の文字「ä」のutf8エンコーディングです)
echo preg_replace('~\w~', '@', "a\xC3\xA4b");
「\ xC3」と「\ xA4」は別個の記号として扱われたため、これは「@@¤@」をエコーします
echo preg_replace('~\w~u', '@', "a\xC3\xA4b");
(「u」に注意)「\ xC3\xA4」は1文字として扱われるため、「@@@」が出力されます。
私のより複雑なpreg関数のいくつか:
(1a)ユーザー名を英数字+アンダースコアとして検証します。
preg_match('/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/',$username)
(1b)可能なUTF代替案:
preg_match('/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/u',$username)
(2a)電子メールの検証:
preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix",$email))
(2b)可能なUTF代替案:
preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ixu",$email))
(3a)改行を正規化する:
preg_replace("/(\n){2,}/","\n\n",$str);
(3b)可能なUTF代替案:
preg_replace("/(\n){2,}/u","\n\n",$str);
これらの変更は問題ないように見えますか?
いいえそうではありません。たとえば、質問 preg_matchおよびPHPのUTF-8 を参照してください。
いいえ、 マルチバイト文字列関数 のように mb_ereg