2009-11-19 12 views
24

PHPで利用可能なマルチバイト 'preg'関数はありません。つまり、デフォルトのpreg_functionsはすべてmbで安全ですか? PHPのドキュメントでは何の言及も見つかりませんでした。PHP preg_functionsはマルチバイトで安全ですか?

+2

私は基本的なCの関数が90%であると確信していますが、それはPHPのバージョンを意味するものではありません。 –

答えて

23

mb_eregのようなPCREを使用する必要があるが、それはコンパイル時に指定する必要があります。 man page for 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 branchと同じです。

+1

私はPHP 5.3.0を使用しています。これはPCREバージョン7.9を含んでいますが、preg_funcsのように見えるので、UTF8定義を含むPCRE config.hファイルを調べました。安全。 情報ありがとうございます! – Spoonface

+0

既存のPHPインストールで使用しているPCREのバージョンを簡単に確認する方法はありますか?私のサーバはPHP 5.5を実行していますが、コンパイルされたPCREライブラリをどのようにして知ることができますか? – thatidiotguy

1

いいえ、そうではありません。たとえば、質問preg_match and UTF-8 in PHPを参照してください。

+0

明確にするため、 'PREG_OFFSET_CAPTURE'は文字オフセットではなくバイトオフセットを生成します。これはPHPでの文字列処理と一貫していますが、かなり混乱する可能性があります。 –

1

はありません、あなたは、UTF-8および他のUnicodeエンコーディングをサポートすることができますmultibyte string functions

+3

これはPOSIXの 'ereg'関数のマルチバイト版ですが、PCREの' preg'関数とまったく同じではありません。 – mercator

+0

ベンSあなたは私のヒーローです:) 私はちょうどテキストを浄化し、テキストの中にäöüßを残したいと思いました。 preg_replaceはこれを正しく実行しませんでしたが、mb_eregはこれを行いました! – Nibbels

+1

マルチバイトエンコーディングがUTF-8である限り、/ u修飾子を使用する限り、マルチバイト安全です。/uエンジンはUTF-8以外のエンコーディングをサポートしていません – hanshenrik

24

pcreはutf8をそのまま使用できます.'u '修飾子のドキュメントを参照してください。

イラスト(\ XC3 \ XA4は、ドイツの文字 "A" のためのUTF8エンコーディングである)

echo preg_replace('~\w~', '@', "a\xC3\xA4b"); 

として扱われた "\ XC3" と "\ XA4" ので、これは "@@¤の@を" エコー異なるシンボル

echo preg_replace('~\w~u', '@', "a\xC3\xA4b"); 

プリント "@@@" ので、 "\ XC3 \ XA4" 単一文字として処理した( 'U' は注意してください)。

+0

本当ですか?うーん、私は正規表現の文字列にあまり熟練していない、私はあなたの考えを見るために私のpreg_コードのいくつかを投稿するかもしれない気にしない場合は? – Spoonface

+0

u修飾語に最適ですが、私はそれを知らなかった –

1

私のより複雑なプリプレグの機能のいくつかを:

(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_replace("/(\n){2,}/","\n\n",$str); 

(3b)が可能UTF代替:

preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ixu",$email)) 

(3A)改行を正規化する

preg_replace("/(\n){2,}/u","\n\n",$str); 

をthse変更が大丈夫に見えるのですか?

+0

いいえ、情報を歓迎 – Spoonface

+0

あなたの電子メールの正規表現は電子メールアドレスのどこにでも '..'を許可すると信じています。 –

関連する問題