PHP で利用できるマルチバイトの 'preg' 関数はありません。それは、デフォルトの preg_functions がすべて mb セーフであることを意味しますか? PHPドキュメントに言及が見つかりませんでした。
5 に答える
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 文字として扱われたためです。
PCRE は UTF-8 およびその他の Unicode エンコーディングをサポートできますが、コンパイル時に指定する必要があります。PCRE 8.0のマニュアルページから:
PCRE の現在の実装は、UTF-8 でエンコードされた文字列と Unicode の一般カテゴリ プロパティのサポートを含め、Perl 5.10 にほぼ対応しています。ただし、UTF-8 と Unicode のサポートは明示的に有効にする必要があります。デフォルトではありません。Unicode テーブルは、Unicode リリース 5.1 に対応しています。
PHP は現在PCRE 7.9を使用しています。システムのバージョンが古い可能性があります。
PHP 5.2 に付属するPCRE libを見ると、 Unicode プロパティと UTF-8 をサポートするように構成されているようです。5.3 ブランチも同様です。
いいえそうではありません。たとえば、質問preg_match と PHP の UTF-8 を参照してください。
私のより複雑な 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);
これらの変更は問題ないように見えますか?
いいえ、次のようなマルチバイト文字列関数を使用する必要がありますmb_ereg