30

PHP で利用できるマルチバイトの 'preg' 関数はありません。それは、デフォルトの preg_functions がすべて mb セーフであることを意味しますか? PHPドキュメントに言及が見つかりませんでした。

4

5 に答える 5

31

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 文字として扱われたためです。

于 2009-11-19T21:41:07.687 に答える
27

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 ブランチも同様です。

于 2009-11-19T21:06:46.873 に答える
2

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

于 2009-11-19T21:03:28.020 に答える
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);

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

于 2009-11-19T22:21:50.563 に答える
1

いいえ、次のようなマルチバイト文字列関数を使用する必要がありますmb_ereg

于 2009-11-19T21:03:47.850 に答える