PHPでは、通常、テキストマッチングに正規表現を使用します。ただし、正規表現は、多言語コンテンツを扱うとき、特に多バイト文字セット(UTF-8、GBKなど)で一致するときにエンコードの問題を発生する場合があります。現時点では、PHPのMBSTRING拡張機能、特にMB_GET_INFOおよびMB_EREG関数が強力にサポートされています。この記事では、これら2つの機能を組み合わせてエンコードの問題を解決し、定期的な一致を正しく実行する方法を紹介します。
MB_GET_INFO関数は、マルチバイト文字エンコードに関する情報を取得するために使用されます。内部文字エンコード、現在のエンコードされたロケールなど、現在のPHP環境のマルチバイト文字列拡張に関する情報を返します。これは、エンコード設定が正しいことをデバッグして確認するのに非常に役立ちます。
MB_EREG関数は、正規表現のマッチングを実行するために使用されるマルチバイトセーフバージョンです。通常のEREG関数に似ていますが、マルチバイト文字セットをサポートします。この関数の重要な特徴は、正しい文字エンコードの下で定期的なマッチングを実行できることです。これは、一貫性のないエンコーディングによるマッチング障害を回避できます。
正規表現でエンコードの問題を正しく処理するには、次の手順を確保する必要があります。
MB_GET_INFOとMB_EREGの使用を開始する前に、最初にPHPのマルチバイトストリング拡張( MBSTRing )がインストールされ、有効になっていることを確認する必要があります。インストールされていない場合は、次のコマンドからインストールできます。
sudo apt-get install php-mbstring
MBSTRING拡張機能を有効にした後、 MB_GET_INFO()を使用して、現在の文字エンコード設定を表示できます。例えば:
<?php
// 得るmbstring構成情報
$mb_info = mb_get_info();
print_r($mb_info);
?>
出力例:
Array
(
[internal_encoding] => UTF-8
[http_output] => pass
[http_input] => pass
[language] => neutral
[encoding_translation] => 0
[encoding_conversion] => 0
)
MBSTRING拡張機能と正しいエンコード設定を確認したら、 MB_EREGを使用して定期的なマッチングに使用できます。最も一般的な慣行は、正規表現のキャラクターエンコードがターゲット文字列と一致するようにすることです。たとえば、UTF-8エンコードされたテキストから中国の語彙を一致させるとします。
<?php
// 設定 mbstring コーディング
mb_internal_encoding("UTF-8");
// ターゲット文字列
$text = "これはテストテキストです";
// 使用 mb_ereg 定期的なマッチングを実行します
if (mb_ereg("テスト", $text)) {
echo "正常に一致します!";
} else {
echo "マッチが失敗しました!";
}
?>
上記のコードでは、 MB_EREGは、セットエンコーディング(UTF-8)に従って漢字を正しく一致させます。 MbString拡張機能が使用されていない場合、デフォルトの正規表現関数( EREGなど)により、マルチバイト文字が一致できないか、文字化けコードを作成する可能性があります。
プロセスのテキストエンコーディングがPHPのデフォルトエンコードと一致しない場合、 MB_EREGはターゲットエンコーディングを指定するオプションも提供します。たとえば、GBKエンコードされたテキストを一致させる場合は、これを行うことができます。
<?php
// 設定コーディング为 GBK
mb_internal_encoding("GBK");
// ターゲット文字列
$text = "これはテストテキストです";
// 使用 mb_ereg 定期的なマッチングを実行します
if (mb_ereg("テスト", $text)) {
echo "正常に一致します!";
} else {
echo "マッチが失敗しました!";
}
?>
このようにして、 MB_EREGはGBKエンコードを使用して、一貫性のないエンコーディングのためにエラーなしで通常の試合を処理します。
実際の開発では、 MB_GET_INFOを介して現在の環境のエンコーディング情報を取得し、必要に応じて一致するエンコードを調整できます。たとえば、多言語アプリケーションに取り組んでおり、異なるユーザーのロケールに基づいて一致するエンコードを決定する必要があるとします。エンコードは、 MB_GET_INFOを使用して動的に設定できます。
<?php
// 得る当前 mbstring 構成情報
$mb_info = mb_get_info();
$current_encoding = $mb_info['internal_encoding'];
// ターゲット文字列
$text = "これはテストテキストです";
// 使用 mb_ereg 进行コーディング匹配
if (mb_ereg("テスト", $text)) {
echo "正常に一致します!当前コーディング:$current_encoding";
} else {
echo "マッチが失敗しました!";
}
?>
MB_GET_INFOとMB_EREGを組み合わせることで、PHPのエンコーディング問題を簡単に解決し、マルチバイト文字セット環境で通常の試合が正しいことを確認できます。 MbString拡張機能によって提供されるこれら2つの機能は、多言語アプリケーションでのキャラクターエンコードの問題を扱うための強力なツールです。