PHP の preg_functions はマルチバイト安全ですか?
-
21-09-2019 - |
質問
PHP ではマルチバイトの 'preg' 関数が利用できないので、デフォルトの preg_functions はすべて MB セーフであるということでしょうか?PHPドキュメントには言及が見つかりませんでした。
解決
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;システムのバージョンが古い可能性があります。
見てみると、 PCREライブラリ これは PHP 5.2 に付属しており、Unicode プロパティと UTF-8 をサポートするように構成されているようです。についても同様です 5.3分岐.
他のヒント
PCREサポートは、 'U' 修飾子のためのマニュアルを参照して、箱から出して、UTF8ます。
イラスト(\ XC3 \ XA4ドイツの文字 "A" のためのUTF8エンコーディングである)
echo preg_replace('~\w~', '@', "a\xC3\xA4b");
このエコー "@@¤@" "\ XC3" と "\ XA4" ので、明確なシンボルとして扱われた。
echo preg_replace('~\w~u', '@', "a\xC3\xA4b");
(注意 'U')プリント "@@@" "\ XC3 \ XA4" 理由は、単一の文字として扱われた。
いいえ、そうではありません。質問 の例えばPHPでするpreg_matchとUTF-8 のを。
を参照してください。いいえ、あなたのようなこのマルチバイト文字列関数を使用する必要があります mb_ereg
する
私のより複雑なプリプレグの機能のいくつか:
(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);
ドゥthse変化が見大丈夫?