Unicode 字符屬性

自 PHP 5.1.0 起, 三個(gè)額外的轉(zhuǎn)義序列在選用 UTF-8 模式時(shí)用于匹配通用字符類型。他們是:

\p{xx}
一個(gè)有屬性 xx 的字符
\P{xx}
一個(gè)沒有屬性 xx 的字符
\X
一個(gè)擴(kuò)展的 Unicode 字符

上面 xx 代表的屬性名用于限制 Unicode 通常的類別屬性。 每個(gè)字符都有一個(gè)這樣的確定的屬性,通過兩個(gè)縮寫的字母指定。 為了與 Perl 兼容, 可以在左花括號(hào) { 后面增加 ^ 表示取反。比如: \p{^Lu} 就等同于 \P{Lu}。

如果通過 \p\P 僅指定了一個(gè)字母,它包含所有以這個(gè)字母開頭的屬性。 在這種情況下,花括號(hào)的轉(zhuǎn)義序列是可選的;以下兩個(gè)例子是等同的:

\p{L}
\pL
支持的 Unicode 屬性
Property Matches Notes
C Other  
Cc Control  
Cf Format  
Cn Unassigned  
Co Private use  
Cs Surrogate  
L Letter 包含以下屬性:Ll、 Lm、LoLt、 Lu.
Ll 小寫字母  
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 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 等擴(kuò)展屬性在 PCRE 中不支持

指定大小寫不敏感匹配對(duì)這些轉(zhuǎn)義序列不會(huì)產(chǎn)生影響,比如, \p{Lu} 始終匹配大寫字母。

Unicode 字符集在具體文字中定義。使用文字名可以匹配這些字符集中的一個(gè)字符。例如:

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

不在確定文字中的則被集中到 Common。當(dāng)前的文字列表中有:

支持的文字
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 轉(zhuǎn)義匹配了 Unicode 可擴(kuò)展字符集(Unicode extended grapheme clusters)。 可擴(kuò)展字符集是一個(gè)或多個(gè) Unicode 字符,組合表達(dá)了單個(gè)象形字符。 因此無論渲染時(shí)實(shí)際使用了多少個(gè)獨(dú)立字符,可以視該 Unicode 等同于 ., 會(huì)匹配單個(gè)組合后的字符。

小于 PCRE 8.32 的版本中(對(duì)應(yīng)小于 PHP 5.4.14 的內(nèi)置綁定 PCRE 庫), \X 等價(jià)于 (?>\PM\pM*)。 也就是說,它匹配一個(gè)沒有 ”mark” 屬性的字符,緊接著任意多個(gè)由 ”mark” 屬性的字符。 并將這個(gè)序列認(rèn)為是一個(gè)原子組(詳見下文)。 典型的有 ”mark” 屬性的字符是影響到前面的字符的重音符。

用 Unicode 屬性來匹配字符的速度并不快, 因?yàn)?PCRE 需要去搜索一個(gè)包含超過 15000 字符的數(shù)據(jù)結(jié)構(gòu)。 這就是為什么在 PCRE中 要使用傳統(tǒng)的轉(zhuǎn)義序列\d\w 而不使用 Unicode 屬性的原因。