PHP Conference Japan 2024

Unicode 字元屬性

自 5.1.0 版起,當選取 *UTF-8 模式* 時,可以使用三個額外的跳脫序列來比對泛用字元類型。它們是

\p{xx}
具有 xx 屬性的字元
\P{xx}
沒有 xx 屬性的字元
\X
擴充的 Unicode 序列

上面以 xx 表示的屬性名稱僅限於 Unicode 通用類別屬性。每個字元都恰好具有一個這樣的屬性,由兩個字母的縮寫指定。為了與 Perl 相容,可以在左大括號和屬性名稱之間加入一個脫字符號 (^) 來指定否定。例如,\p{^Lu}\P{Lu} 相同。

如果使用 \p\P 只指定一個字母,則它包含所有以該字母開頭的屬性。在這種情況下,如果沒有否定,則跳脫序列中的大括號是可選的;以下兩個範例具有相同的效果

\p{L}
\pL
支援的屬性碼
屬性 符合 注意事項
C 其他  
Cc 控制字元  
Cf 格式字元  
Cn 未指派的字元  
Co 私人使用區字元  
Cs 代理字元  
L 字母 包含以下屬性:LlLmLoLtLu
Ll 小寫字母  
Lm 修飾字母  
Lo 其他字母  
Lt 首字母大寫字母 (Titlecase Letter)  
Lu 大寫字母  
M 標記  
Mc 間距標記  
Me 環繞標記  
Mn 非間距標記  
N 數字  
Nd 十進位數字  
Nl 字母數字  
No 其他數字  
P 標點符號  
Pc 連接標點符號  
Pd 破折號標點符號  
Pe 結束標點符號  
Pf 結尾標點符號  
Pi 起始標點符號  
Po 其他標點符號  
Ps 開始標點符號  
S 符號  
Sc 貨幣符號  
Sk 修飾符號  
Sm 數學符號  
So 其他符號  
Z 分隔符號  
Zl 分行符號  
Zp 分段符號  
Zs 空白分隔符號  

PCRE 不支援 InMusicalSymbols 等擴充屬性。

指定不區分大小寫(忽略大小寫)的匹配不會影響這些跳脫序列。例如,\p{Lu} 永遠只匹配大寫字母。

Unicode 字元集被定義為屬於某些文字。可以使用文字名稱來匹配來自這些集合的字元。例如

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

不屬於已識別文字的字元被歸類為 Common。目前的文字列表如下:

支援的文字
阿拉伯文 亞美尼亞文 阿維斯陀文 峇里文 巴姆穆文
巴塔克文 孟加拉文 注音符號 婆羅米文 盲文
布吉文 布希德文 加拿大原住民語 卡里亞文 查克馬文
占文 切羅基文 通用字元 科普特文 楔形文字
塞浦路斯文 斯拉夫文 德撒律字母 梵文 埃及象形文字
衣索比亞文 喬治亞文 格拉哥里字母 哥德文 希臘文
古吉拉特文 古爾穆基文 漢字 韓文 哈努諾文
希伯來文 平假名 帝國亞拉姆文 繼承文字 銘刻巴列維文
銘刻帕提亞文 爪哇文 凱提文 坎那達文 片假名
克耶里文 佉盧文 高棉文 寮文 拉丁文
雷布查文 林布文 線形文字B 傈僳文 呂基亞文
呂底亞文 馬拉雅拉姆文 曼達文 曼尼普爾文 麥羅埃草書 (Meroitic Cursive)
麥羅埃聖書體 (Meroitic Hieroglyphs) 苗文 (Miao) 蒙古文 (Mongolian) 緬甸文 (Myanmar) 新傣仂文 (New Tai Lue)
恩科文 (N'Ko) 歐甘文 (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*)。也就是說,它匹配一個沒有「標記」屬性的字元,後跟零個或多個具有「標記」屬性的字元,並將序列視為一個原子群組(見下文)。具有「標記」屬性的字元通常是影響前一個字元的重音符號。

通過 Unicode 屬性匹配字元速度並不快,因為 PCRE 必須搜尋一個包含超過一萬五千個字元資料的結構。這就是為什麼傳統的逸出序列,例如 \d\w 在 PCRE 中不使用 Unicode 屬性的原因。

新增註記

使用者貢獻的註記 7 則註記

huhwatnouDONTspamPLEASE at hotmail dot com
8 年前
要為其他逸出序列(\p{xx}、\P{xx} 和 \X)選擇 UTF-8 模式,請使用「u」修飾符(請參閱 https://php.dev.org.tw/manual/en/reference.pcre.pattern.modifiers.php)。

我想知道為什麼德語的 sharp S (ß) 被 \p{Cc} 標記為控制字元,我花了一段時間才正確閱讀第一句話:「自 5.1.0 起,當選擇 UTF-8 模式時,可以使用三個額外的逸出序列來匹配通用字元類型。」:-$ 然後才找到如何這樣做。
mercury at caucasus dot net
14 年前
可以在這裡找到一篇解釋所有這些屬性的優秀文章:https://regular-expressions.dev.org.tw/unicode.html
Steve
1 年前
範例總是有用的!請參閱 https://unicodeplus.com/category 以了解更多資訊。

C 其他
Cc 控制字元(Unicode 字碼點在 U+0000-U+001F 和 U+007F-U+009F 範圍內)
Cf 格式字元(軟連字元號 (U+00AD)、零寬度空格 (U+200B) 等)
Cn 未指派(任何不在 Unicode 表中的字碼點)
Co 私用字元
Cs 代理字元(U+D800 到 U+DFFF 範圍內的字元,在 utf-8 中無效)

L 字母
Ll 小寫字母 (a-z, µßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ 等等)
Lm 修飾字母 (類似字母的字符,通常與其他字符組合使用,但此處它們單獨存在)
ʰʱʲʳʴʵʶʷʸʹʺʻʼʽʾʿˀˁˆˇˈˉˊˋˌˍˎˏːˑˠˡˢˣˤˬˮʹͺՙ 等等)
Lo 其他字母 (ªºƻǀǁǂǃʔ 以及許多來自單大小寫字母表的表意文字和字母)
Lt 首字母大寫字母 (DžLjNjDzᾈᾉᾊᾋᾌᾍᾎᾏᾘᾙᾚᾛᾜᾝᾞᾟᾨᾩᾪᾫᾬᾭᾮᾯᾼῌῼ)
Lu 大寫字母 (A-Z, ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ 等等)
L& 普通字母 (具有 Lu、Ll 或 Lt 屬性的任何字符)

M 標記
Mc 間距標記 (拉丁文字中無)
Me 包圍標記 (例如 a⃞ 中的組合式包圍正方形 (U+20DE),a⃠ 中的組合式包圍圓形反斜線 (U+20E0))
Mn 非間距標記 (組合式附加符號 U+0300-U+036f,例如字母 a 上的重音符號:áâãāa̅ăȧäảåa̋ǎa̍a̎ȁa̐ȃ)

N 數字
Nd 十進制數字 (0123456789、٠١٢٣٤٥٦٧٨٩ 以及許多其他文字中的數字)
Nl 字母數字 (ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅬⅭⅮⅯⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅺⅻⅼⅽⅾⅿ 以及其他一些)
No 其他數字 (⁰¹²³⁴⁵⁶⁷⁸⁹ ₀₁₂₃₄₅₆₇₈₉ ½⅓⅔¼¾⅕⅖⅗⅘⅙⅚⅐⅛⅜⅝⅞⅑⅒ ①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ 等等)

P 標點符號
Pc 連接標點符號 (_ 底線 (U+005F), ‿ 下劃線 U+203F, ⁀ 字符連接線 (U+2040) 等等)
Pd 破折號標點符號 (- 連字號-減號 (U+002D), ‐ 連字號 (U+2010), ‑ 不斷開連字號 (U+2011), ‒ 數字破折號 (U+2012),
– 短破折號 (U+2013), — 長破折號 (U+2014), ― 水平線 (U+2015) 等等)
Pe 結束標點符號 (右括號、方括號或大括號:`)` (U+0029), `]` (U+005D), `}` (U+007D) 等等)
Pf 結尾標點符號 (右引號:» (U+00BB), ’ (U+2019), ” (U+201D) 等等)
Pi 起始標點符號 (左引號:« (U+00AB), ‘ (U+2018), “ (U+201C) 等等)
Po 其他標點符號 (!"#%&'*,./:;?@\¡§¶·¿)
Ps 開始標點符號 (左括號、方括號或大括號:`(` (U+0028), `[` (U+005B), `{` (U+007B) 等等)

S 符號
Sc 貨幣符號 ($¢£¤¥, ₠ ₡ ₢ ₣ ₤ ₥ ₦ ₧ ₨ ₩ ₪ ₫ € ₭ ₮ ₯ ₰ ₱ ₲ ₳ ₴ ₵ ₶ ₷ ₸ ₹ ₺ ₻ ₼ ₽ ₾ ₿ (U+20A0-U+20BF) 等等)
Sk 修飾符號 (類似符號的字符,通常與其他字符組合使用,但此處它們單獨存在
^`¨¯´¸ 等等)
Sm 數學符號 (+<=>|~¬±×÷϶ 以及更多)
So 其他符號 (¦ 斷開的豎線 (U+00A6), © 版權符號 (U+00A9), ® 註冊符號 (U+00AE), ° 度數符號 (U+00B0);
箭頭、標誌、表情符號等等)

Z 分隔符號
Zl 行分隔符號 (行分隔符號 (U+2028))
Zp 段落分隔符號 (段落分隔符號 (U+2029))
Zs 空格分隔符號 (空格、不間斷空格、全方空格、倍全方空格、半方空格、倍半方空格、數字空格、窄空格、極窄空格等等)
xuantoaiph at gmail dot com
10 年前
我的國家,越南,有我們自己的字母表。
http://en.wikipedia.org/wiki/Vietnamese_alphabet
我希望 PHP 對越南文的支援能更好。
o_shes01 at uni-muenster dot de
13 年前
對於那些感到疑惑的人:'letter_titlecase' 適用於二合字母/三合字母,其中大寫僅涉及第一個字母。
例如,Unicode 中「LJ」二合字母有三種編碼點
(*) 大寫「LJ」:U+01C7
(*) 首字母大寫「Lj」:U+01C8
(*) 小寫「lj」:U+01C9
suit at rebell dot at
14 年前
這些屬性通常只有在 PCRE 使用 "--enable-unicode-properties" 編譯時才可用。

如果您想匹配任何單詞,但想提供一個後備方案,您可以這樣做:

<?php
if(@preg_match_all('/\p{L}+/u', $str, $arr) {
// 後備方案寫在這裡
// 例如使用 '/\w+/u' 進行較不精確的匹配
}
?>
php at lnx-bsp dot net
7 年前
頁面頂部的說明並未明確指出,但這些跳脫字元類別可以包含在方括號內,以組成更廣泛的字元類別。例如:

<?php preg_match( '/[\p{N}\p{L}]+/', $data ) ?>

將會匹配任何字母和數字的組合。
To Top