PHP 7.4.19 Released!

Unicode Karakterlerinini Özellikleri

UTF-8 kipi seçildiğinde soysal karakter türleriyle eşleşen üç düzenli ifade işleci daha devreye girmiştir. Bunlar:

\p{xx}
xx özelliğine sahip bir karakter
\P{xx}
xx özelliği olmayan bir karakter
\X
bir genişletilmiş Unicode dizilimi

Yukarıda xx ile belirtilen özellik isimleri Unicode genel sınıf özellikleriyle sınırlıdır. Belirtilen her karakter, belli bir özelliğin iki harflik kısaltmasındaki harflerle aynı olmak zorundadır. Perl ile uyumluluk için, olumsuzlama işleci kaşlı ayraç ile özellik kısaltmasının ilk harfi arasına konmalıdır. Örneğin, \p{^Lu} şablonu \P{Lu} ile aynıdır.

Eğer \p veya \P ile tek bir harf belirtilirse bu harfle başlayan tüm özellikleri ifade edecektir. Böyle bir durumda, olumsuzlama işleci kullanılmayacaksa kaşlı ayraçların kullanımı isteğe bağlıdır. Yani, bu iki örnek aynı etkiye sahiptir:

      \p{L}
      \pL
     
Desteklenen özellik kodları
Özellik Eşleşmeler Açıklamalar
CDiğer 
CcDenetim 
CfBiçem 
CnAtanmamış  
CoÖzel kullanım  
Csİkame  
LHarf Şu özellikleri içerir: Ll, Lm, Lo, Lt ve Lu.
LlKüçük harf  
LmDeğiştirici harf  
LoDiğer harf  
LtBaşlık harfi  
LuBüyük harf  
Mİm 
McBoşluk imi  
MeKapsama imi  
MnBoşluk bırakmama imi 
NSayı 
NdOnluk sayı  
NlHarf numarası  
NoDiğer sayı  
PNoktalama 
PcBağlayıcı noktalama  
PdTire imi 
PeKapama imi  
PfSonlandırma imi  
PiBaşlatma imi  
PoDiğer noktalama  
PsAçma imi  
SSimge 
ScPara simgesi  
SkDeğiştirici simge
SmMatematiksel simge  
SoDiğer simge  
ZAyraç 
ZlSatır ayracı  
ZpParagraf ayracı  
ZsBoşluk ayracı  

"InMusicalSymbols" gibi ek özellikler PCRE tarafından desteklenmemektedir.

Harf büyüklüğüne duyarsız eşleşme belirtilmesi bu önceleme dizilimlerini etkilemez. Örneğin, \p{Lu} şablonu daima sadece büyük harflerle eşleşecektir.

Unicode karakter kümeleri, belirli dillere ait olarak tanımlanır. Bu kümelerden birindeki bir karakter, bir dil adı kullanılarak eşleştirilebilir. Örneğin:

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

Tanımlanmış bir dilin parçası olmayanlar ortak (Common) olarak bir araya toplanır. Mevcut dil listesi:

Desteklenen Diller
Arapça Ermenice Avestan Balice Bamum
Batak Bengali Bopomofo Brahmi Braille
Bugice Buhid Kanadalı_Aborijin Karya Çakma
Cham Çeroki Ortak Kıpti Çivi Yazısı
Kıbrıslı Kiril Deseret Devanagari Mısır_Hiyeroglifleri
Etiyopyalı Gürcü Glagolitik Gotik Yunan
Gujarati Gurmukhi Han Hangul Hanunoo
İbranice Hiragana İmparatorluk_Aramice Miras Yazıtlı_Pehlevi
Yazıtlı_Partiyalı Cavaca Kaithi Kannada Katakana
Kayah_Li Kharoshthi Kımer Lao Latince
Lepcha Limbu Doğrusal_B Lisu Likyaca
Lidyaca Malayalamca Mandaik Meetei_Mayek Meroitik_Elyazısı
Meroitik_Hiyeroglifler Miao Moğolca Myanmar New_Tai_Lue
Nko Ogham Eski_İtalik Eski_Farsça Eski_Güney_Arapçası
Eski_Türk Ol_Chiki Oriya Osmanya Phags_Pa
Fenike Rejang Runik Samiriyeli Saurashtra
Sharada Shavian Sinhala Sora_Sompeng Sundaca
Syloti_Nagri Süryanice Tagalog Tagbanwa Tai_Le
Tai_Tham Tai_Viet Takri Tamil Telugu
Thaana Thai Tibetçe Tifinagh Ugaritik
Vai Yi        

\X öncelemi, bir Unicode genişletilmiş grafem kümesiyle eşleşir. Genişletilmiş bir grafem kümesi, tek bir glif oluşturmak için birleşen bir veya daha fazla Unicode karakteridir. Gerçekte, bu, Unicode eşdeğeri olarak düşünülebilir. Çünkü onu oluşturmak için gerçekte kaç karakter kullanıldığına bakılmaksızın, oluşturulmuş bir karakterle eşleşecektir.

8.32'den daha eski PCRE sürümlerinde (birlikte verilen PCRE kitaplığını kullanırken 5.4.14'ten önceki PHP sürümlerine karşılık gelir), \X ile (?>\PM\pM*) eşdeğerdir. Yani, "mark" özelliği olmayan bir karakterle, ardından "mark" özelliğine sahip sıfır veya daha fazla karakterle eşleşir ve diziyi bir atomik grup olarak ele alır (aşağıya bakın). "Mark" özelliğine sahip karakterler tipik olarak önceki karakteri etkileyen aksanlardır.

Unicode karakterleriyle eşleşme hızlı değildir, çünkü PCRE on beş binden fazla karakter içeren bir kümeyi araştırmak zorundadır. \d ve \w gibi geleneksel işleçlerin PCRE'de Unicode özelliklerini kullanmamasının sebebi budur.

add a note add a note

User Contributed Notes 8 notes

up
16
huhwatnouDONTspamPLEASE at hotmail dot com
5 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
10 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
7 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
10 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
11 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
7 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
3 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
10 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