要為其他逸出序列(\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 模式時,可以使用三個額外的逸出序列來匹配通用字元類型。」:-$ 然後才找到如何這樣做。
自 5.1.0 版起,當選取 *UTF-8 模式* 時,可以使用三個額外的跳脫序列來比對泛用字元類型。它們是
上面以 xx
表示的屬性名稱僅限於 Unicode 通用類別屬性。每個字元都恰好具有一個這樣的屬性,由兩個字母的縮寫指定。為了與 Perl 相容,可以在左大括號和屬性名稱之間加入一個脫字符號 (^) 來指定否定。例如,\p{^Lu}
與 \P{Lu}
相同。
如果使用 \p
或 \P
只指定一個字母,則它包含所有以該字母開頭的屬性。在這種情況下,如果沒有否定,則跳脫序列中的大括號是可選的;以下兩個範例具有相同的效果
\p{L} \pL
屬性 | 符合 | 注意事項 |
---|---|---|
C |
其他 | |
Cc |
控制字元 | |
Cf |
格式字元 | |
Cn |
未指派的字元 | |
Co |
私人使用區字元 | |
Cs |
代理字元 | |
L |
字母 | 包含以下屬性:Ll 、Lm 、Lo 、Lt 和 Lu 。 |
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 屬性的原因。
要為其他逸出序列(\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 模式時,可以使用三個額外的逸出序列來匹配通用字元類型。」:-$ 然後才找到如何這樣做。
可以在這裡找到一篇解釋所有這些屬性的優秀文章:https://regular-expressions.dev.org.tw/unicode.html
範例總是有用的!請參閱 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 空格分隔符號 (空格、不間斷空格、全方空格、倍全方空格、半方空格、倍半方空格、數字空格、窄空格、極窄空格等等)
我的國家,越南,有我們自己的字母表。
http://en.wikipedia.org/wiki/Vietnamese_alphabet
我希望 PHP 對越南文的支援能更好。
對於那些感到疑惑的人:'letter_titlecase' 適用於二合字母/三合字母,其中大寫僅涉及第一個字母。
例如,Unicode 中「LJ」二合字母有三種編碼點
(*) 大寫「LJ」:U+01C7
(*) 首字母大寫「Lj」:U+01C8
(*) 小寫「lj」:U+01C9
這些屬性通常只有在 PCRE 使用 "--enable-unicode-properties" 編譯時才可用。
如果您想匹配任何單詞,但想提供一個後備方案,您可以這樣做:
<?php
if(@preg_match_all('/\p{L}+/u', $str, $arr) {
// 後備方案寫在這裡
// 例如使用 '/\w+/u' 進行較不精確的匹配
}
?>
頁面頂部的說明並未明確指出,但這些跳脫字元類別可以包含在方括號內,以組成更廣泛的字元類別。例如:
<?php preg_match( '/[\p{N}\p{L}]+/', $data ) ?>
將會匹配任何字母和數字的組合。