Funzioni per le stringhe

Nette\Utils\Strings è una classe statica che contiene utili funzioni per lavorare con le stringhe in codifica UTF-8.

Installazione:

composer require nette/utils

Tutti gli esempi presuppongono che sia definito questo alias di classe:

use Nette\Utils\Strings;

Maiuscole e minuscole

Queste funzioni richiedono l'estensione PHP mbstring.

lower (string $s): string

Converte una stringa UTF-8 in minuscolo.

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

upper (string $s): string

Converte una stringa UTF-8 in maiuscolo.

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

firstUpper (string $s): string

Converte il primo carattere di una stringa UTF-8 in maiuscolo e lascia invariati gli altri caratteri.

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

firstLower (string $s): string

Converte il primo carattere di una stringa UTF-8 in minuscolo e lascia invariati gli altri caratteri.

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

capitalize (string $s): string

Converte in maiuscolo il primo carattere di ogni parola di una stringa UTF-8 e in minuscolo gli altri.

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

Modificare una stringa

normalize (string $s): string

Rimuove i caratteri di controllo, normalizza i fine riga in \n, elimina le righe vuote iniziali e finali, elimina gli spazi finali delle righe e normalizza l'UTF-8 nella forma normale NFC.

unixNewLines (string $s): string

Converte i fine riga in \n, come si usa nei sistemi Unix. I fine riga sono: \n, \r, \r\n, il separatore di riga U+2028, il separatore di paragrafo U+2029.

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

platformNewLines (string $s)string

Converte i fine riga nei caratteri specifici della piattaforma corrente, cioè \r\n su Windows e \n altrove. I fine riga sono: \n, \r, \r\n, il separatore di riga U+2028, il separatore di paragrafo U+2029.

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

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

Trasforma una stringa UTF-8 nella forma usata negli URL, cioè rimuove i segni diacritici e sostituisce con trattini tutti i caratteri tranne le lettere dell'alfabeto inglese e le cifre.

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

Se altri caratteri devono essere conservati, si possono indicare nel secondo parametro.

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

Il terzo parametro può disattivare la conversione in minuscolo.

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

Richiede l'estensione PHP intl.

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

Rimuove gli spazi bianchi (o altri caratteri indicati dal secondo parametro) all'inizio e alla fine di una stringa UTF-8.

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

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

Accorcia una stringa UTF-8 alla lunghezza massima indicata, cercando di preservare le parole intere. Se la stringa viene accorciata, alla fine vengono aggiunti i puntini di sospensione (modificabili con il terzo parametro).

$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

Indenta da sinistra un testo su più righe. Il secondo parametro indica il numero di caratteri di indentazione, il terzo il carattere (o i caratteri) da usare per indentare (di norma la tabulazione).

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

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

Riempie una stringa UTF-8 fino alla lunghezza indicata anteponendo da sinistra la stringa $pad.

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

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

Riempie una stringa UTF-8 fino alla lunghezza indicata aggiungendo da destra la stringa $pad.

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

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

Restituisce la porzione della stringa UTF-8 $s indicata dalla posizione iniziale $start e dalla lunghezza $length. Se $start è negativo, la stringa restituita inizierà dal $start-esimo carattere a partire dalla fine.

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

reverse (string $s): string

Inverte una stringa UTF-8.

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

length (string $s): int

Restituisce il numero di caratteri (non di byte) di una stringa UTF-8.

È il numero di code point Unicode, che può differire dal numero di grafemi.

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

startsWith (string $haystack, string $needle)bool

Controlla se la stringa $haystack inizia con la stringa $needle.

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

Usate la funzione nativa str_starts_with().

endsWith (string $haystack, string $needle)bool

Controlla se la stringa $haystack finisce con la stringa $needle.

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

Usate la funzione nativa str_ends_with().

contains (string $haystack, string $needle)bool

Controlla se la stringa $haystack contiene la stringa $needle.

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

Usate la funzione nativa str_contains().

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

Confronta due stringhe UTF-8 o loro parti, senza distinguere maiuscole e minuscole. Se $length è null, confronta le stringhe intere. Se è negativo, confronta il numero corrispondente di caratteri a partire dalla fine delle stringhe. Altrimenti confronta il numero corrispondente di caratteri a partire dall'inizio.

Strings::compare('Nette', 'nette');     // true
Strings::compare('Nette', 'next', 2);   // true - i primi 2 caratteri coincidono
Strings::compare('Nette', 'Latte', -2); // true - gli ultimi 2 caratteri coincidono

findPrefix (array $strings)string

Trova il prefisso comune delle stringhe. Restituisce una stringa vuota se non trova alcun prefisso comune.

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

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

Restituisce la porzione della stringa $haystack che precede la $nth occorrenza della stringa $needle. Restituisce null se $needle non viene trovata. Se $nth è negativo, la ricerca parte dalla fine della stringa.

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

Restituisce la porzione della stringa $haystack che segue la $nth occorrenza della stringa $needle. Restituisce null se $needle non viene trovata. Se $nth è negativo, la ricerca parte dalla fine della stringa.

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

Restituisce la posizione, in caratteri, della $nth occorrenza della stringa $needle nella stringa $haystack. Restituisce null se $needle non viene trovata. Se $nth è negativo, la ricerca parte dalla fine della stringa.

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

Codifica

fixEncoding (string $s): string

Rimuove da una stringa i caratteri UTF-8 non validi.

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

checkEncoding (string $s)bool

Controlla se una stringa è una stringa UTF-8 valida.

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

Usate Nette\Utils\Validators::isUnicode().

toAscii (string $s): string

Converte una stringa UTF-8 in ASCII, cioè rimuove i segni diacritici e simili.

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

Richiede l'estensione PHP intl.

chr (int $code): string

Restituisce un determinato carattere in UTF-8 a partire da un code point (un numero nell'intervallo 0×0000..D7FF oppure 0xE000..10FFFF).

Strings::chr(0xA9); // '©' in codifica UTF-8

ord (string $c): int

Restituisce il code point di un determinato carattere in UTF-8 (un numero nell'intervallo 0×0000..D7FF oppure 0xE000..10FFFF).

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

Espressioni regolari

La classe Strings offre funzioni per lavorare con le espressioni regolari. A differenza delle funzioni native di PHP, hanno un'API più comprensibile, un supporto migliore per Unicode e, cosa essenziale, rilevano gli errori. Qualsiasi errore durante la compilazione o l'elaborazione dell'espressione solleva Nette\RegexpException.

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

Divide una stringa in un array usando un'espressione regolare. Anche le espressioni tra parentesi vengono catturate e restituite.

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

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

Se $skipEmpty è true, vengono restituiti solo gli elementi non vuoti:

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

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

Se è indicato $limit, vengono restituite solo le sottostringhe fino al limite e il resto della stringa viene messo nell'ultimo elemento. Un limite di –1 o 0 significa nessun limite.

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

Se $utf8 è true, la valutazione passa alla modalità Unicode, come con l'uso del modificatore u.

Se $captureOffset è true, viene restituita anche la posizione di ogni corrispondenza nella stringa (in byte; in caratteri se è impostato $utf8). Questo cambia il valore di ritorno in un array in cui ogni elemento è una coppia composta dalla stringa trovata e dalla sua posizione.

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

Strings::split('žlutý, kůň', '~,\s*~', captureOffset: true, utf8: true);
// [['žlutý', 0], ['kůň', 7]] // le posizioni sono in caratteri

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

Cerca in una stringa una parte che corrisponda a un'espressione regolare e restituisce un array che contiene l'espressione trovata e le singole sottoespressioni, oppure null se non trova alcuna corrispondenza.

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

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

Se $unmatchedAsNull è true, i sottopattern senza corrispondenza vengono restituiti come null; altrimenti vengono restituiti come stringa vuota oppure omessi del tutto:

Strings::match('hello', '~\w+(!+)?~');
// ['hello'] (il gruppo facoltativo !+ non ha trovato corrispondenza)

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

Se $utf8 è true, la valutazione passa alla modalità Unicode, come con l'uso del modificatore u:

Strings::match('žlutý kůň', '~\w+~'); // senza UTF-8
// ['lut'] (trova solo i caratteri di parola ASCII)

Strings::match('žlutý kůň', '~\w+~', utf8: true); // con UTF-8
// ['žlutý'] (trova i caratteri di parola Unicode)

Il parametro $offset può indicare la posizione iniziale della ricerca (in byte; in caratteri se è impostato $utf8).

Se $captureOffset è true, viene restituita anche la posizione di ogni corrispondenza nella stringa (in byte; in caratteri se è impostato $utf8). Questo cambia il valore di ritorno in un array in cui ogni elemento è una coppia composta dalla stringa trovata e dal suo offset:

Strings::match('žlutý!', '~\w+(!+)?~', captureOffset: true); // senza UTF-8
// [['lut', 2]] (solo corrispondenza ASCII, offset in byte)

Strings::match('žlutý!', '~\w+(!+)?~', captureOffset: true, utf8: true); // con UTF-8
// [['žlutý!', 0], ['!', 5]] (corrispondenza Unicode, offset in caratteri)

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

Cerca in una stringa tutte le occorrenze che corrispondono a un'espressione regolare e restituisce un array di array contenenti l'espressione trovata e le singole sottoespressioni.

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

Se $patternOrder è true, la struttura dei risultati cambia: il primo elemento è un array delle corrispondenze complete del pattern, il secondo è un array delle stringhe che corrispondono al primo sottopattern tra parentesi e così via:

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

Se $unmatchedAsNull è true, i sottopattern senza corrispondenza vengono restituiti come null; altrimenti vengono restituiti come stringa vuota oppure omessi:

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

Se $utf8 è true, la valutazione passa alla modalità Unicode, come con l'uso del modificatore u:

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

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

Il parametro $offset può indicare la posizione iniziale della ricerca (in byte; in caratteri se è impostato $utf8).

Se $captureOffset è true, viene restituita anche la posizione di ogni corrispondenza nella stringa (in byte; in caratteri se è impostato $utf8). Questo cambia la struttura del valore di ritorno, dove ogni elemento di corrispondenza è una coppia [stringa_trovata, posizione]:

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]],
] */

Se $lazy è true, la funzione restituisce un Generator invece di un array. Questo offre vantaggi notevoli in termini di prestazioni quando si lavora con stringhe grandi, perché le corrispondenze vengono trovate progressivamente invece di elaborare l'intera stringa in una volta. Permette così di gestire in modo efficiente input molto grandi. Inoltre potete interrompere l'elaborazione in qualsiasi momento, se trovate la corrispondenza cercata, risparmiando tempo di calcolo.

$matches = Strings::matchAll($largeText, '~\w+~', lazy: true);
foreach ($matches as $match) {
    echo "Found: $match[0]\n";
    // l'elaborazione si può interrompere in qualsiasi momento, per esempio con break;
}

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

Sostituisce tutte le occorrenze che corrispondono a un'espressione regolare. $replacement è una maschera della stringa di sostituzione oppure una funzione di callback.

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

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

La funzione permette anche più sostituzioni passando come secondo parametro un array nel formato pattern => replacement:

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

Il parametro $limit limita il numero di sostituzioni eseguite. Un limite di –1 significa nessun limite.

Se $utf8 è true, la valutazione passa alla modalità Unicode, come con l'uso del modificatore u.

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

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

Se $captureOffset è true, alla callback viene passata anche la posizione di ogni corrispondenza nella stringa (in byte; in caratteri se è impostato $utf8). Questo cambia la struttura dell'array passato, dove ogni elemento è una coppia [stringa_trovata, posizione].

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

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

Se $unmatchedAsNull è true, i sottopattern senza corrispondenza vengono passati alla callback come null; altrimenti vengono passati come stringa vuota oppure omessi:

Strings::replace(
	'ac',
	'~(a)(b)*(c)~',
	function (array $m) { dump($m); return ''; },
);
// stampa ['ac', 'a', '', 'c']

Strings::replace(
	'ac',
	'~(a)(b)*(c)~',
	function (array $m) { dump($m); return ''; },
	unmatchedAsNull: true,
);
// stampa ['ac', 'a', null, 'c']
versione: 4.x