5

Unicode Common Locale Data Repository(CLDR)には、言語と文字の関係に関する豊富な情報があります。たとえば、misc.exemplarCharactersチャートを見ると、特定の言語で使用されている文字を判別できます。これらのチャートの生データはXMLファイルとして保存され、模範文字はUnicode正規表現標準UTS18に従って正規表現として保存されます。

UTS18正規表現がどのように見えるかのいくつかの例を次に示します。

1. [a à b c ç d e é è f g h i í ï j k l ŀ m n o ó ò p q r s t u ú ü v w x y z]
2. [অ আ ই ঈ উ ঊ ঋ এ ঐ ও ঔ ং \u0981 ঃ ক খ গ ঘ ঙ চ ছ জ ঝ ঞ ট ঠ ড {ড\u09BC}ড় ঢ {ঢ\u09BC}ঢ় ণ ত থ দ ধ ন প ফ ব ভ ম য {য\u09BC} ৰ ল ৱ শ ষ স হ া ি ী \u09C1 \u09C2 \u09C3 ে ৈ ো ৌ \u09CD]
3. [a á b ɓ c d ɗ e é ɛ {ɛ\u0301} f g i í j k l m n {ny} ŋ o ó ɔ {ɔ\u0301} p r s t u ú ū w y]

PHPとSimpleXMLを使用してXMLデータを解析し、これらの正規表現文字列を分離しています。ここで、個々のマルチバイト文字をこれらの正規表現に一致させたいと思います。現在、mb_ereg_match関数を使用しています。この関数は、次の警告の1つ以上を生成します(正規表現によって異なります)。

mbregex compile err: premature end of char-class in ...
mbregex compile err: empty range in char class in ...
mbregex compile err: empty char-class in ...

これが機能しない理由について何かアイデアはありますか?

4

1 に答える 1

2

Sergey が提案したように、mb_ereg_match() 関数を呼び出す前に次の行を追加しました。

mb_internal_encoding('UTF-8');
mb_regex_encoding('UTF-8');

この追加により、上記の警告のうち 2 つが解消されました。次の警告だけが残っていました。

mbregex compile err: empty char-class in ...

追加のデバッグを行った後、少数の CLDR XML ファイルに実際に空の正規表現文字列が含まれていることがわかりました。たとえばkn.xml、次の行があります。

<exemplarCharacters type="auxiliary">[]</exemplarCharacters>

これらの行は間違っていると思います。期待される動作は単に行を完全に除外することです (これはほとんどの場合、CLDR 全体で当てはまります)。

したがって、空の正規表現文字列を単に捨てることで、この最後のエラーを排除することができました。

これが他の誰かに役立つことを願っています!

于 2012-06-19T20:11:29.740 に答える