最近、上司からデータ重複チェックの小さな演習を依頼されました。これには、中国語フィールドを含むファイルから中国語フィールドを抽出して保存し、PHP を使用して開発することが含まれます。真ん中は、PHP の正規表現の中国語のマッチングの問題です。インターネットでいろいろ調べましたが、これも非常にわかりにくく、正確な情報がありませんでした。自分のコードを修正してテストした後、最初に抽出関数を書き留めました。
最初に注意すべきことは、全角文字のエンコーディングの問題です。ここでは、将来、中国語と同じ意味の韓国語や日本語などのエンコーディングの問題も発生する可能性があります。
1.GBK(GB2312/GB18030)
Notepad++ では、まず通常の書き込みが間違っているかどうかをテストできます。最初の式をテストするために [u4e00-u9fa5]+ を使用しました。+ 記号は複数の
を示します。一致記号。結果は予想どおりなので、この通常のルールをスクリプトで使用できますか?
テストしてみましょう。preg_match_all('/[u4e00-u9fa5]+/', $subject,$matches) 呼び出しを使用すると、次の結果が表示されます: Compilation failed: PCRE doesn't support L, l, N{ name} 、U、またはオフセット 2 の u。 。 。 。とても大きくないですか? ?その理由は何でしょうか?
多くの情報を調べた結果、u (PCRE_UTF8) は上記の PCRE であることがわかりました。これは Perl 互換の正規表現ライブラリを含む Perl ライブラリです。この修飾子は、Perl と互換性のない PCRE の追加機能を有効にします。パターン文字列は UTF-8 として扱われます。この修飾子は、Unix では PHP 4.1.0 以降、win32 では PHP 4.2.3 以降で使用できます。 PHP 正規表現には、16 進数データを表現するさまざまな方法もあります。PHP では、16 進数データを表すために x が使用されます。次に、コードを最適化すると、検出関数は次のようになります:
$store=新しいstoreDataAdapter($txtContent); $match=配列(); $dsName=$store->data_convert(‘/[x7f-xff]+/',$txtContent); foreach ($dsName として $val){
入力ファイルは次のとおりです:
、中国語を抽出した後の出力ファイルの内容は次のとおりです:
、予想されるニーズに沿ったもの。