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) | Ll 、
|
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 プロパティを使用しないように
なっています。