web-dev-qa-db-ja.com

PHP preg_functionsマルチバイトは安全ですか?

PHPで使用できるマルチバイトの「preg」関数はありません。つまり、デフォルトのpreg_functionsはすべてmbセーフです。 PHPのドキュメントに言及が見つかりませんでした。

28
Spoonface

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ブランチ

25
outis

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文字として扱われるため、「@@@」が出力されます。

27
user187291

私のより複雑な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);

これらの変更は問題ないように見えますか?

1
Spoonface

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

1
Gumbo

いいえ、 マルチバイト文字列関数 のように mb_ereg

1
Ben S