Unicode 文字プロパティ

PHP 5.1.0 以降、UTF-8 モード を設定した場合に、 一般的な文字タイプにマッチする新たなエスケープシーケンスが 3 つ追加されました。

\p{xx}
xx プロパティを持つ文字
\P{xx}
xx プロパティを持たない文字
\X
拡張 Unicode シーケンス

ここで xx で表されているプロパティ名は、Unicode で 一般カテゴリプロパティ (general category properties) として規定されているものに なります。すべての文字は、いずれかひとつのプロパティを持ちます。 プロパティは、2 文字の略語で表されます。Perl と同じく、 開き波カッコとプロパティ名との間にハット文字を記述することで否定を指定できます。 たとえば、\p{^Lu}\P{Lu} と同じです。

\p もしくは \P の後に、一文字だけを記述すると その文字で始まるすべてのプロパティが指定されたことになります。 この場合、否定の指定をしていない場合、波カッコを使用しなくても構いません。 以下の 2 つの例は等価になります。

\p{L}
\pL
使用可能なプロパティコード
プロパティ マッチ 備考
C その他 (Other)  
Cc コントロール文字 (Control)  
Cf 非可視整形用文字 (Format)  
Cn 未定義コードポイント (Unassigned)  
Co 私的利用領域 (Private use)  
Cs サロゲート (Surrogate)  
L アルファベット (Letter) LlLmLoLt および Lu を含む
Ll 小文字アルファベット (Lower case letter)  
Lm 擬似文字 (Modifier letter)  
Lo その他の文字 (Other letter)  
Lt タイトル文字 (Title case letter)  
Lu 大文字アルファベット (Upper case letter)  
M 記号 (Mark)  
Mc 修飾文字 (Spacing mark)  
Me 他の文字を囲むための文字 (Enclosing mark)  
Mn 他の文字を修飾するための文字 (Non-spacing mark)  
N 数字 (Number)  
Nd 10 進数字 (Decimal number)  
Nl 数値を表す文字 (Letter number)  
No その他の数字 (Other number)  
P 句読記号 (Punctuation)  
Pc 連結用句読記号 (Connector punctuation)  
Pd ダッシュ (Dash punctuation)  
Pe 閉じ句読記号 (Close punctuation)  
Pf 末尾句読記号 (Final punctuation)  
Pi 先頭句読記号 (Initial punctuation)  
Po その他の句読記号 (Other punctuation)  
Ps 開き句読記号 (Open punctuation)  
S 記号 (Symbol)  
Sc 通貨記号 (Currency symbol)  
Sk 合わせ文字 (Modifier symbol)  
Sm 数学記号 (Mathematical symbol)  
So その他の記号 (Other symbol)  
Z 区切り文字 (Separator)  
Zl 行区切り文字 (Line separator)  
Zp 段落区切り文字 (Paragraph separator)  
Zs 空白文字 (Space separator)  

InMusicalSymbols のような拡張プロパティ (extended properties) は PCRE によりサポートされていません。

大小文字を区別しないマッチングを設定していても、これらのエスケープ シーケンスには影響しません。たとえば、\p{Lu} は 常に大文字にのみマッチします。

Unicode の文字は、何らかのスクリプトに属するものとして定義されています。 スクリプト名を指定すれば、そのスクリプトの文字群の一文字にマッチさせることができます。 たとえば、次のように使います。

  • \p{Greek}
  • \P{Han}

どのスクリプトにも属しない文字は、ぜんぶまとめて Common で表します。現在サポートするスクリプトは次のとおりです。

サポートするスクリプト
Arabic Armenian Avestan Balinese Bamum
Batak Bengali Bopomofo Brahmi Braille
Buginese Buhid Canadian_Aboriginal Carian Chakma
Cham Cherokee Common Coptic Cuneiform
Cypriot Cyrillic Deseret Devanagari Egyptian_Hieroglyphs
Ethiopic Georgian Glagolitic Gothic Greek
Gujarati Gurmukhi Han Hangul Hanunoo
Hebrew Hiragana Imperial_Aramaic Inherited Inscriptional_Pahlavi
Inscriptional_Parthian Javanese Kaithi Kannada Katakana
Kayah_Li Kharoshthi Khmer Lao Latin
Lepcha Limbu Linear_B Lisu Lycian
Lydian Malayalam Mandaic Meetei_Mayek Meroitic_Cursive
Meroitic_Hieroglyphs Miao Mongolian Myanmar New_Tai_Lue
Nko Ogham Old_Italic Old_Persian Old_South_Arabian
Old_Turkic Ol_Chiki Oriya Osmanya Phags_Pa
Phoenician Rejang Runic Samaritan Saurashtra
Sharada Shavian Sinhala Sora_Sompeng Sundanese
Syloti_Nagri Syriac Tagalog Tagbanwa Tai_Le
Tai_Tham Tai_Viet Takri Tamil Telugu
Thaana Thai Tibetan Tifinagh Ugaritic
Vai Yi        

\X は、Unicode 拡張書記素クラスタにマッチします。 拡張書記素クラスタとは、ひとつあるいは複数の Unicode 文字の組み合わせで単一のグリフを構成するものです。 事実上、これは Unicode 版の . だと考えてかまいません。 その文字をレンダリングするために実際に何文字が使われているかは考えずに、ひとつの合成文字に対応します。

8.32 より古いバージョンの PCRE (これは、組み込みの PCRE ライブラリを使っている場合には PHP 5.4.14 より前のバージョンにあたります) では、 \X(?>\PM\pM*) と等価です。 つまり、記号 (mark) プロパティの付いていない文字と、その後に続く 0 以上の 記号プロパティ付きの文字にマッチし、その並びをアトミック (atomic) な まとまりとして取り扱います。記号プロパティ付きの文字とは、アクセント記号などの 直前の文字に対して影響するようなもののことです。

Unicode プロパティを使った文字列マッチングは速くありません。PCRE は 15,000 以上のデータからなるストラクチャを検索する必要が有るためです。 そのため、PCRE では、\d\w といった 以前から有るエスケープシーケンスは Unicode プロパティを使用しないように なっています。