Dize Fonksiyonları

Nette\Utils\Strings, UTF-8 kodlamalı dizelerle çalışmaya yarayan kullanışlı fonksiyonlar içeren statik bir sınıftır.

Kurulum:

composer require nette/utils

Tüm örnekler, aşağıdaki sınıf takma adının tanımlandığını varsayar:

use Nette\Utils\Strings;

Harf Büyüklüğü

Bu fonksiyonlar mbstring PHP eklentisini gerektirir.

lower (string $s): string

UTF-8 dizesini küçük harfe dönüştürür.

Strings::lower('Hello World'); // 'hello world'

upper (string $s): string

UTF-8 dizesini büyük harfe dönüştürür.

Strings::upper('Hello World'); // 'HELLO WORLD'

firstUpper (string $s): string

UTF-8 dizesinin ilk karakterini büyük harfe dönüştürür, diğer karakterleri değiştirmez.

Strings::firstUpper('hello world'); // 'Hello world'

firstLower (string $s): string

UTF-8 dizesinin ilk karakterini küçük harfe dönüştürür, diğer karakterleri değiştirmez.

Strings::firstLower('Hello world'); // 'hello world'

capitalize (string $s): string

UTF-8 dizesindeki her sözcüğün ilk karakterini büyük, diğerlerini küçük harfe dönüştürür.

Strings::capitalize('hello world'); // 'Hello World'

Dize Düzenleme

normalize (string $s): string

Denetim karakterlerini kaldırır, satır sonlarını \n biçimine normalleştirir, baştaki ve sondaki boş satırları kırpar, satırların sonundaki boşlukları kırpar ve UTF-8'i NFC normal biçimine normalleştirir.

unixNewLines (string $s): string

Satır sonlarını Unix sistemlerinde kullanılan \n biçimine dönüştürür. Satır sonları şunlardır: \n, \r, \r\n, U+2028 satır ayırıcı, U+2029 paragraf ayırıcı.

$unixLikeLines = Strings::unixNewLines($string);

platformNewLines (string $s)string

Satır sonlarını geçerli platforma özgü karakterlere, yani Windows'ta \r\n, diğer sistemlerde \n biçimine dönüştürür. Satır sonları şunlardır: \n, \r, \r\n, U+2028 satır ayırıcı, U+2029 paragraf ayırıcı.

$platformLines = Strings::platformNewLines($string);

webalize (string $s, ?string $charlist=null, bool $lower=true)string

UTF-8 dizesini URL'lerde kullanılan biçime dönüştürür; yani aksan işaretlerini kaldırır ve İngiliz alfabesindeki harfler ile rakamlar dışındaki tüm karakterleri tireyle değiştirir.

Strings::webalize('žluťoučký kůň'); // 'zlutoucky-kun'

Başka karakterlerin de korunması gerekiyorsa bunlar ikinci parametrede belirtilebilir.

Strings::webalize('10. image_id', '._'); // '10.-image_id'

Üçüncü parametre, küçük harfe dönüştürmeyi engelleyebilir.

Strings::webalize('Dobrý den', null, false); // 'Dobry-den'

intl PHP eklentisini gerektirir.

trim (string $s, string $charlist=self::TrimCharacters)string

UTF-8 dizesinin başındaki ve sonundaki boşlukları (ya da ikinci parametrede belirtilen başka karakterleri) kırpar.

Strings::trim('  Hello  '); // 'Hello'

truncate (string $s, int $maxLen, string $append=`'…'`)string

UTF-8 dizesini belirtilen en fazla uzunluğa kısaltır, bunu yaparken sözcükleri bölmemeye çalışır. Dize kısaltılırsa sonuna üç nokta (üçüncü parametreyle değiştirilebilir) eklenir.

$text = 'Hello, how are you today?';
Strings::truncate($text, 5);       // 'Hell…'
Strings::truncate($text, 20);      // 'Hello, how are you…'
Strings::truncate($text, 30);      // 'Hello, how are you today?'
Strings::truncate($text, 20, '~'); // 'Hello, how are you~'

indent (string $s, int $level=1, string $chars=`"\t"`)string

Çok satırlı bir metni soldan girintiler. İkinci parametre girinti karakterlerinin sayısını, üçüncü parametre ise girinti için kullanılacak karakter(ler)i belirtir (varsayılan sekme).

Strings::indent('Nette');         // "\tNette"
Strings::indent('Nette', 2, '+'); // '++Nette'

padLeft (string $s, int $length, string $pad=`' '`)string

UTF-8 dizesini, soldan $pad dizesini ekleyerek belirtilen uzunluğa tamamlar.

Strings::padLeft('Nette', 6);        // ' Nette'
Strings::padLeft('Nette', 8, '+*');  // '+*+Nette'

padRight (string $s, int $length, string $pad=`' '`)string

UTF-8 dizesini, sağdan $pad dizesini ekleyerek belirtilen uzunluğa tamamlar.

Strings::padRight('Nette', 6);       // 'Nette '
Strings::padRight('Nette', 8, '+*'); // 'Nette+*+'

substring (string $s, int $start, ?int $length=null)string

$s UTF-8 dizesinin, $start başlangıç konumu ve $length uzunluğuyla belirtilen bir parçasını döndürür. $start negatifse döndürülen dize, sondan $start'ıncı karakterden başlar.

Strings::substring('Nette Framework', 0, 5); // 'Nette'
Strings::substring('Nette Framework', 6);    // 'Framework'
Strings::substring('Nette Framework', -4);   // 'work'

reverse (string $s): string

UTF-8 dizesini ters çevirir.

Strings::reverse('Nette'); // 'etteN'

length (string $s): int

UTF-8 dizesindeki karakter (bayt değil) sayısını döndürür.

Bu, Unicode kod noktalarının sayısıdır ve grafem sayısından farklı olabilir.

Strings::length('Nette');   // 5
Strings::length('červená'); // 7

startsWith (string $haystack, string $needle)bool

$haystack dizesinin $needle dizesiyle başlayıp başlamadığını denetler.

$haystack = 'Starts';
$needle = 'St';
Strings::startsWith($haystack, $needle); // true

Yerleşik str_starts_with() fonksiyonunu kullanın.

endsWith (string $haystack, string $needle)bool

$haystack dizesinin $needle dizesiyle bitip bitmediğini denetler.

$haystack = 'Ends';
$needle = 'ds';
Strings::endsWith($haystack, $needle); // true

Yerleşik str_ends_with() fonksiyonunu kullanın.

contains (string $haystack, string $needle)bool

$haystack dizesinin $needle dizesini içerip içermediğini denetler.

$haystack = 'Auditorium';
$needle = 'dit';
Strings::contains($haystack, $needle); // true

Yerleşik str_contains() fonksiyonunu kullanın.

compare (string $left, string $right, ?int $length=null)bool

İki UTF-8 dizesini ya da onların parçalarını, büyük/küçük harf ayrımı gözetmeden karşılaştırır. $length null ise dizelerin tamamını karşılaştırır. Negatifse dizelerin sonundan ilgili sayıda karakteri karşılaştırır. Diğer durumlarda baştan ilgili sayıda karakteri karşılaştırır.

Strings::compare('Nette', 'nette');     // true
Strings::compare('Nette', 'next', 2);   // true - ilk 2 karakter eşleşiyor
Strings::compare('Nette', 'Latte', -2); // true - son 2 karakter eşleşiyor

findPrefix (array $strings)string

Dizelerin ortak önekini bulur. Ortak önek yoksa boş dize döndürür.

Strings::findPrefix(['prefix-a', 'prefix-bb', 'prefix-c']); // 'prefix-'
Strings::findPrefix(['Nette', 'is', 'great']);              // ''

before (string $haystack, string $needle, int $nth=1): ?string

$haystack dizesinin, $needle dizesinin $nth'inci geçtiği yerden önceki parçasını döndürür. $needle bulunmazsa null döndürür. $nth negatifse dizenin sonundan arar.

Strings::before('Nette_is_great', '_', 1);  // 'Nette'
Strings::before('Nette_is_great', '_', -2); // 'Nette'
Strings::before('Nette_is_great', ' ');     // null
Strings::before('Nette_is_great', '_', 3);  // null

after (string $haystack, string $needle, int $nth=1): ?string

$haystack dizesinin, $needle dizesinin $nth'inci geçtiği yerden sonraki parçasını döndürür. $needle bulunmazsa null döndürür. $nth negatifse dizenin sonundan arar.

Strings::after('Nette_is_great', '_', 2);  // 'great'
Strings::after('Nette_is_great', '_', -1); // 'great'
Strings::after('Nette_is_great', ' ');     // null
Strings::after('Nette_is_great', '_', 3);  // null

indexOf (string $haystack, string $needle, int $nth=1)?int

$needle dizesinin $haystack içinde $nth'inci geçtiği yerin karakter konumunu döndürür. $needle bulunmazsa null döndürür. $nth negatifse dizenin sonundan arar.

Strings::indexOf('abc abc abc', 'abc', 2);  // 4
Strings::indexOf('abc abc abc', 'abc', -1); // 8
Strings::indexOf('abc abc abc', 'd');       // null

Kodlama

fixEncoding (string $s): string

Dizeden geçersiz UTF-8 karakterlerini kaldırır.

$correctString = Strings::fixEncoding($invalidString);

checkEncoding (string $s)bool

Dizenin geçerli bir UTF-8 dizesi olup olmadığını denetler.

$isUtf8 = Strings::checkEncoding($string);

Nette\Utils\Validators::isUnicode() kullanın.

toAscii (string $s): string

UTF-8 dizesini ASCII'ye dönüştürür; yani aksan işaretlerini vb. kaldırır.

Strings::toAscii('žluťoučký kůň'); // 'zlutoucky kun'

intl PHP eklentisini gerektirir.

chr (int $code): string

Bir kod noktasından (0×0000..D7FF ya da 0xE000..10FFFF aralığında bir sayı) UTF-8'deki ilgili karakteri döndürür.

Strings::chr(0xA9); // UTF-8 kodlamasında '©'

ord (string $c): int

UTF-8'deki bir karakterin kod noktasını (0×0000..D7FF ya da 0xE000..10FFFF aralığında bir sayı) döndürür.

Strings::ord('©'); // 169 (0xA9)

Düzenli İfadeler

Strings sınıfı, düzenli ifadelerle çalışmaya yarayan fonksiyonlar sunar. Yerleşik PHP fonksiyonlarının aksine daha anlaşılır bir API'ye, daha iyi Unicode desteğine ve en önemlisi hata saptamaya sahiptirler. Derleme ya da ifade işleme sırasındaki her hata Nette\RegexpException fırlatır.

split (string $subject, string $pattern, bool $captureOffset=false, bool $skipEmpty=false, int $limit=-1, bool $utf8=false)array

Bir dizeyi düzenli ifade kullanarak diziye böler. Parantez içindeki ifadeler de yakalanıp döndürülür.

Strings::split('hello, world', '~,\s*~');
// ['hello', 'world']

Strings::split('hello, world', '~(,)\s*~');
// ['hello', ',', 'world']

$skipEmpty true ise yalnızca boş olmayan öğeler döndürülür:

Strings::split('hello, world, ', '~,\s*~');
// ['hello', 'world', '']

Strings::split('hello, world, ', '~,\s*~', skipEmpty: true);
// ['hello', 'world']

$limit belirtilirse yalnızca sınıra kadar alt dizeler döndürülür ve dizenin geri kalanı son öğeye konur. –1 ya da 0 sınırı, sınır yok demektir.

Strings::split('hello, world, third', '~,\s*~', limit: 2);
// ['hello', 'world, third']

$utf8 true ise değerlendirme, u değiştiricisini kullanmaya benzer şekilde Unicode kipine geçer.

$captureOffset true ise her eşleşmenin dizedeki konumu da döndürülür (bayt cinsinden; $utf8 ayarlıysa karakter cinsinden). Bu, dönüş değerini her öğesi eşleşen dize ile konumundan oluşan bir çift olan bir diziye çevirir.

Strings::split('žlutý, kůň', '~,\s*~', captureOffset: true);
// [['žlutý', 0], ['kůň', 9]]

Strings::split('žlutý, kůň', '~,\s*~', captureOffset: true, utf8: true);
// [['žlutý', 0], ['kůň', 7]] // konumlar karakter cinsinden

match (string $subject, string $pattern, bool $captureOffset=false, int $offset=0, bool $unmatchedAsNull=false, bool $utf8=false)?array

Bir dizede düzenli ifadeyle eşleşen bir parça arar ve bulunan ifadeyle alt ifadeleri içeren bir dizi, eşleşme yoksa null döndürür.

Strings::match('hello!', '~\w+(!+)~');
// ['hello!', '!']

Strings::match('hello!', '~X~');
// null

$unmatchedAsNull true ise eşleşmeyen alt desenler null olarak döndürülür; aksi hâlde boş dize olarak döndürülür ya da tümüyle atlanır:

Strings::match('hello', '~\w+(!+)?~');
// ['hello'] (isteğe bağlı !+ grubu eşleşmedi)

Strings::match('hello', '~\w+(!+)?~', unmatchedAsNull: true);
// ['hello', null]

$utf8 true ise değerlendirme, u değiştiricisini kullanmaya benzer şekilde Unicode kipine geçer:

Strings::match('žlutý kůň', '~\w+~'); // UTF-8 olmadan
// ['lut'] (yalnızca ASCII sözcük karakterleriyle eşleşir)

Strings::match('žlutý kůň', '~\w+~', utf8: true); // UTF-8 ile
// ['žlutý'] (Unicode sözcük karakterleriyle eşleşir)

$offset parametresi, aramanın başlangıç konumunu belirtebilir (bayt cinsinden; $utf8 ayarlıysa karakter cinsinden).

$captureOffset true ise her eşleşmenin dizedeki konumu da döndürülür (bayt cinsinden; $utf8 ayarlıysa karakter cinsinden). Bu, dönüş değerini her öğesi eşleşen dize ile kaymasından oluşan bir çift olan bir diziye çevirir:

Strings::match('žlutý!', '~\w+(!+)?~', captureOffset: true); // UTF-8 olmadan
// [['lut', 2]] (yalnızca ASCII eşleşmesi, kayma bayt cinsinden)

Strings::match('žlutý!', '~\w+(!+)?~', captureOffset: true, utf8: true); // UTF-8 ile
// [['žlutý!', 0], ['!', 5]] (Unicode eşleşmesi, kaymalar karakter cinsinden)

matchAll (string $subject, string $pattern, bool $captureOffset=false, int $offset=0, bool $unmatchedAsNull=false, bool $patternOrder=false, bool $utf8=false, bool $lazy=false): array|Generator

Bir dizede düzenli ifadeyle eşleşen tüm yerleri arar ve bulunan ifadeyle alt ifadeleri içeren dizilerden oluşan bir dizi döndürür.

Strings::matchAll('hello, world!!', '~\w+(!+)?~');
/* [
	0 => ['hello'],
	1 => ['world!!', '!!'],
] */

$patternOrder true ise sonuçların yapısı değişir: ilk öğe tam desen eşleşmelerinin dizisi, ikincisi ilk parantezli alt desenle eşleşen dizelerin dizisi vb. olur:

Strings::matchAll('hello, world!!', '~\w+(!+)?~', patternOrder: true);
/* [
	0 => ['hello', 'world!!'],
	1 => ['', '!!'],
] */

$unmatchedAsNull true ise eşleşmeyen alt desenler null olarak döndürülür; aksi hâlde boş dize olarak döndürülür ya da atlanır:

Strings::matchAll('hello, world!!', '~\w+(!+)?~', unmatchedAsNull: true);
/* [
	0 => ['hello', null],
	1 => ['world!!', '!!'],
] */

$utf8 true ise değerlendirme, u değiştiricisini kullanmaya benzer şekilde Unicode kipine geçer:

Strings::matchAll('žlutý kůň', '~\w+~');
/* [
	0 => ['lut'],
	1 => ['k'],
] */

Strings::matchAll('žlutý kůň', '~\w+~', utf8: true);
/* [
	0 => ['žlutý'],
	1 => ['kůň'],
] */

$offset parametresi, aramanın başlangıç konumunu belirtebilir (bayt cinsinden; $utf8 ayarlıysa karakter cinsinden).

$captureOffset true ise her eşleşmenin dizedeki konumu da döndürülür (bayt cinsinden; $utf8 ayarlıysa karakter cinsinden). Bu, dönüş değerinin yapısını değiştirir; her eşleşme öğesi [eşleşen_dize, konum] çifti olur:

Strings::matchAll('žlutý kůň', '~\w+~', captureOffset: true);
/* [
	0 => [['lut', 2]],
	1 => [['k', 8]],
] */

Strings::matchAll('žlutý kůň', '~\w+~', captureOffset: true, utf8: true);
/* [
	0 => [['žlutý', 0]],
	1 => [['kůň', 6]],
] */

$lazy true ise fonksiyon dizi yerine bir Generator döndürür. Bu, büyük dizelerle çalışırken belirgin bir başarım kazancı sağlar; çünkü eşleşmeler dizenin tamamı bir kerede işlenmek yerine adım adım bulunur. Böylece çok büyük girdiler verimli biçimde ele alınabilir. Ayrıca aradığınız eşleşmeyi bulduğunuzda işlemeyi istediğiniz anda kesip hesaplama süresinden tasarruf edebilirsiniz.

$matches = Strings::matchAll($largeText, '~\w+~', lazy: true);
foreach ($matches as $match) {
    echo "Found: $match[0]\n";
    // İşleme istenildiği an kesilebilir, örneğin break; ile
}

replace (string $subject, string|array $pattern, string|callable $replacement='', int $limit=-1, bool $captureOffset=false, bool $unmatchedAsNull=false, bool $utf8=false)string

Düzenli ifadeyle eşleşen tüm yerleri değiştirir. $replacement, bir değiştirme dizesi maskesi ya da bir callback fonksiyonudur.

Strings::replace('hello, world!', '~\w+~', '--');
// '--, --!'

Strings::replace('hello, world!', '~\w+~', fn($m) => strrev($m[0]));
// 'olleh, dlrow!'

Fonksiyon, ikinci parametre olarak desen => değiştirme biçiminde bir dizi vererek birden çok değiştirme yapmaya da olanak tanır:

Strings::replace('hello, world!', [
	'~\w+~' => '--',
	'~,\s+~' => ' ',
]);
// '-- --!'

$limit parametresi yapılan değiştirmelerin sayısını sınırlar. –1 sınırı, sınır yok demektir.

$utf8 true ise değerlendirme, u değiştiricisini kullanmaya benzer şekilde Unicode kipine geçer.

Strings::replace('žlutý kůň', '~\w+~', '--');
// 'ž--ý --ůň'

Strings::replace('žlutý kůň', '~\w+~', '--', utf8: true);
// '-- --'

$captureOffset true ise her eşleşmenin dizedeki konumu da (bayt cinsinden; $utf8 ayarlıysa karakter cinsinden) callback'e aktarılır. Bu, aktarılan dizinin yapısını değiştirir; her öğe [eşleşen_dize, konum] çifti olur.

Strings::replace(
	'žlutý kůň',
	'~\w+~',
	function (array $m) { dump($m); return ''; },
	captureOffset: true,
);
// [['lut', 2]] ve [['k', 8]] dökümünü verir

Strings::replace(
	'žlutý kůň',
	'~\w+~',
	function (array $m) { dump($m); return ''; },
	captureOffset: true,
	utf8: true,
);
// [['žlutý', 0]] ve [['kůň', 6]] dökümünü verir

$unmatchedAsNull true ise eşleşmeyen alt desenler callback'e null olarak aktarılır; aksi hâlde boş dize olarak aktarılır ya da atlanır:

Strings::replace(
	'ac',
	'~(a)(b)*(c)~',
	function (array $m) { dump($m); return ''; },
);
// ['ac', 'a', '', 'c'] dökümünü verir

Strings::replace(
	'ac',
	'~(a)(b)*(c)~',
	function (array $m) { dump($m); return ''; },
	unmatchedAsNull: true,
);
// ['ac', 'a', null, 'c'] dökümünü verir
versiyon: 4.x