Свойства Unicode-символов

С версии стандарта 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 Control  
Cf Формат  
Cn Не присвоено  
Co Частное использование  
Cs Суррогат  
L Буква Включает следующие свойства: Ll, Lm, Lo, Lt и Lu.
Ll Строчная буква  
Lm Модификатор буквы  
Lo Другая буква  
Lt Заглавная буква  
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. Текущий список сценариев:

Поддерживаемые сценарии
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-эквивалент для ., поскольку он находит один независимый комплексный символ, независимо от того, сколько отдельных символов нужно для его отрисовки.

Для версий PCRE до 8.32 (что соответствует версиям PHP до 5.4.14 при работе со встроенным модулем PCRE), последовательность \X равносильна записи (?>\PM\pM*). Таким образом, он ищет символы без свойства «mark», и рассматривает последовательность как атомарную группу (см ниже). Символы со свойством «mark» обычно являются отличительными признаками, которые влияют на предыдущий символ.

Совпадение символов по Unicode-свойству — не быстрая операция, поскольку модулю PCRE приходится выполнить поиск в структуре данных, которая содержит более пятнадцати тысяч символов. Поэтому традиционные управляющие последовательности в модуле PCRE, например \d и \w, не используют Unicode-свойства.

add a note add a note

User Contributed Notes 8 notes

up
16
huhwatnouDONTspamPLEASE at hotmail dot com
8 years ago
To select UTF-8 mode for the additional escape sequences (\p{xx}, \P{xx}, and \X) , use the "u" modifier (see http://php.net/manual/en/reference.pcre.pattern.modifiers.php).

I wondered why a German sharp S (ß) was marked as a control character by \p{Cc} and it took me a while to properly read the first sentence: "Since 5.1.0, three additional escape sequences to match generic character types are available when UTF-8 mode is selected. " :-$ and then to find out how to do so.
up
8
mercury at caucasus dot net
13 years ago
An excellent article explaining all these properties can be found here: http://www.regular-expressions.info/unicode.html
up
11
xuantoaiph at gmail dot com
10 years ago
My country, Vietnam, have our own alphabet table:
http://en.wikipedia.org/wiki/Vietnamese_alphabet
I hope PHP will support better than in Vietnamese.
up
4
o_shes01 at uni-muenster dot de
13 years ago
For those who wonder: 'letter_titlecase' applies to digraphs/trigraphs, where capitalization involves only the first letter.
For example, there are three codepoints for the "LJ" digraph in Unicode:
  (*) uppercase "LJ": U+01C7
  (*) titlecase "Lj": U+01C8
  (*) lowercase "lj": U+01C9
up
3
suit at rebell dot at
14 years ago
these properties are usualy only available if PCRE is compiled with "--enable-unicode-properties"

if you want to match any word but want to provide a fallback, you can do something like that:

<?php
if(@preg_match_all('/\p{L}+/u', $str, $arr) {
 
// fallback goes here
  // for example just '/\w+/u' for a less acurate match
}
?>
up
1
Yzmir Ramirez
10 years ago
If you are working with older environments you will need to first check to see if the version of PCRE will work with unicode directives described above:

<?php

// Need to check PCRE version because some environments are
// running older versions of the PCRE library
// (run in *nix environment `pcretest -C`)

$allowInternational = false;
if (
defined('PCRE_VERSION')) {
    if (
intval(PCRE_VERSION) >= 7) { // constant available since PHP 5.2.4
       
$allowInternational = true;
    }
}
?>

Now you can do a fallback regex (e.g. use "/[a-z]/i"), when the PCRE library version is too old or not available.
up
-2
php at lnx-bsp dot net
6 years ago
Not made clear in the top of page explanation, but these escaped character classes can be included within square brackets to make a broader character class. For example:

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

Will match any combination of letters and numbers.
up
-4
o_shes01 at uni-muenster dot de
13 years ago
For those who wonder: 'letter_titlecase' applies to digraphs/trigraphs, where capitalization involves only the first letter.
For example, there are three codepoints for the "LJ" digraph in Unicode:
  (*) uppercase "LJ": U+01C7
  (*) titlecase "Lj": U+01C8
  (*) lowercase "lj": U+01C9
To Top