自 PHP 5.1.0 起, 三個(gè)額外的轉(zhuǎn)義序列在選用 UTF-8 模式時(shí)用于匹配通用字符類型。他們是:
上面 xx
代表的屬性名用于限制 Unicode 通常的類別屬性。
每個(gè)字符都有一個(gè)這樣的確定的屬性,通過兩個(gè)縮寫的字母指定。
為了與 Perl 兼容,
可以在左花括號(hào) { 后面增加 ^ 表示取反。比如:
\p{^Lu}
就等同于 \P{Lu}
。
如果通過 \p
或 \P
僅指定了一個(gè)字母,它包含所有以這個(gè)字母開頭的屬性。
在這種情況下,花括號(hào)的轉(zhuǎn)義序列是可選的;以下兩個(gè)例子是等同的:
\p{L} \pL
Property | Matches | Notes |
---|---|---|
C |
Other | |
Cc |
Control | |
Cf |
Format | |
Cn |
Unassigned | |
Co |
Private use | |
Cs |
Surrogate | |
L |
Letter |
包含以下屬性:Ll 、
Lm 、Lo 、Lt 、
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 屬性的原因。