Edited at

アラビア語のシャクルや装飾文字を除去する正規表現(PHP)

More than 3 years have passed since last update.


シャクルとは

アラビア語は母音を記さず子音だけを記すことは知られていますが、(子供向けとかで)子音を表現するために「シャクル」というものが使われることがあります。どんなやつかは wikipediaのシャクルの項 をご覧ください。

たとえば、アラビア語で「モスク」は「مسجد」(msjd)ですが、これにシャクルをつけると「مَسْجِد‎」(masjid)となります。なんか点がついてますね。

このシャクルですが、もちろんUnicodeでの割り当てがあります。( PDF )

UTF-8ではどうなっているかというと、こんな感じです。

データの検索などに使うため、正規化の一貫としてシャクルだけを取り除きたい需要がどこかにあるのかもしれないと思ったので書きます。


取り除くべき文字について

アラビア語の正規化はマトモに取り組むと闇(エジプト方言におけるヤーの対応とかある)らしいですが、まぁU+064B(ファトハターン、\xd9\x8b)からU+065F(下付波ハムザ、\xd9\x9f)まで消せばいいんではないでしょうか。本稿ではマッダ付きアリフをアリフに変換するとかそういうのは扱いません。

したがって、preg_replaceでシャクルを削除する正規表現は以下のようになります

preg_replace('/[\x{d98b}-\x{d99f}]/u', '', $arabic_string);

まぁ、文字列がアラビア語であることが前提ではありますが。

厳密にやるなら、アリフからヤーの後にシャクルがあることが前提となるので

preg_replace('/([\x{d8a7}-\x{d98a}])[\x{d98b}-\x{d99f}]/u', '$1', $arabic_string);

でしょうか。