Lavorare con le stringhe

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

Installazione:

composer require nette/utils

Tutti gli esempi presuppongono la creazione di un alias:

use Nette\Utils\Strings;

Cambio di maiuscole/minuscole

Queste funzioni richiedono l'estensione PHP mbstring.

lower (string $s): string

Converte una stringa UTF-8 in minuscolo.

Strings::lower('Dobrý den'); // 'dobrý den'

upper (string $s): string

Converte una stringa UTF-8 in maiuscolo.

Strings::upper('Dobrý den'); // 'DOBRÝ DEN'

firstUpper (string $s): string

Converte la prima lettera di una stringa UTF-8 in maiuscolo, le altre rimangono invariate.

Strings::firstUpper('dobrý den'); // 'Dobrý den'

firstLower (string $s): string

Converte la prima lettera di una stringa UTF-8 in minuscolo, le altre rimangono invariate.

Strings::firstLower('Dobrý den'); // 'dobrý den'

capitalize (string $s): string

Converte la prima lettera di ogni parola in una stringa UTF-8 in maiuscolo, le altre in minuscolo.

Strings::capitalize('Dobrý den'); // 'Dobrý Den'

Modifica della stringa

normalize (string $s): string

Rimuove i caratteri di controllo, normalizza le terminazioni di riga a \n, rimuove le righe vuote iniziali e finali, rimuove gli spazi finali nelle righe, normalizza UTF-8 alla forma normale NFC.

unixNewLines (string $s): string

Converte le terminazioni di riga in \n utilizzate nei sistemi Unix. Le terminazioni di riga sono: \n, \r, \r\n, separatore di riga U+2028, separatore di paragrafo U+2029.

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

platformNewLines (string $s)string

Converte le terminazioni di riga nei caratteri specifici della piattaforma corrente, ovvero \r\n su Windows e \n altrove. Le terminazioni di riga sono: \n, \r, \r\n, separatore di riga U+2028, separatore di paragrafo U+2029.

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

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

Modifica una stringa UTF-8 nella forma utilizzata negli URL, ovvero rimuove i diacritici e sostituisce tutti i caratteri, ad eccezione delle lettere dell'alfabeto inglese e dei numeri, con un trattino.

Strings::webalize('náš produkt'); // 'nas-produkt'

Se devono essere conservati anche altri caratteri, possono essere specificati nel secondo parametro della funzione.

Strings::webalize('10. obrázek_id', '._'); // '10.-obrazek_id'

Con il terzo parametro è possibile sopprimere la conversione in minuscolo.

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

Richiede l'estensione PHP intl.

trim (string $s, ?string $charlist=null)string

Rimuove gli spazi (o altri caratteri specificati dal secondo parametro) dall'inizio e dalla fine di una stringa UTF-8.

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

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

Tronca una stringa UTF-8 alla lunghezza massima specificata, cercando di mantenere le parole intere. Se la stringa viene accorciata, aggiunge tre puntini alla fine (modificabile con il terzo parametro).

$text = 'Řekněte, jak se máte?';
Strings::truncate($text, 5);       // 'Řekn…'
Strings::truncate($text, 20);      // 'Řekněte, jak se…'
Strings::truncate($text, 30);      // 'Řekněte, jak se máte?'
Strings::truncate($text, 20, '~'); // 'Řekněte, jak se~'

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

Indenta un testo multilinea da sinistra. Il numero di indentazioni è determinato dal secondo parametro, il carattere di indentazione dal terzo (il valore predefinito è il tabulatore).

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

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

Completa una stringa UTF-8 alla lunghezza specificata ripetendo la stringa $pad da sinistra.

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

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

Completa una stringa UTF-8 alla lunghezza specificata ripetendo la stringa $pad da destra.

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

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

Restituisce una parte della stringa UTF-8 $s specificata dalla posizione iniziale $start e dalla lunghezza $length. Se $start è negativo, la stringa restituita inizierà dal carattere -$start 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) in una stringa UTF-8.

Questo è il numero di punti di codice Unicode, che può differire dal numero di grafemi.

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

startsWith (string $haystack, string $needle)bool

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

$haystack = 'Začíná';
$needle = 'Za';
Strings::startsWith($haystack, $needle); // true

Utilizzare la funzione nativa str_starts_with().

endsWith (string $haystack, string $needle)bool

Verifica se la stringa $haystack termina con la stringa $needle.

$haystack = 'Končí';
$needle = 'čí';
Strings::endsWith($haystack, $needle); // true

Utilizzare la funzione nativa str_ends_with().

contains (string $haystack, string $needle)bool

Verifica se la stringa $haystack contiene $needle.

$haystack = 'Posluchárna';
$needle = 'sluch';
Strings::contains($haystack, $needle); // true

Utilizzare la funzione nativa str_contains().

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

Confronto di due stringhe UTF-8 o delle loro parti senza distinzione tra maiuscole e minuscole. Se $length contiene null, vengono confrontate le stringhe intere, se è negativo, viene confrontato il numero corrispondente di caratteri dalla fine delle stringhe, altrimenti viene confrontato il numero corrispondente di caratteri dall'inizio.

Strings::compare('Nette', 'nette');     // true
Strings::compare('Nette', 'next', 2);   // true - corrispondenza dei primi 2 caratteri
Strings::compare('Nette', 'Latte', -2); // true - corrispondenza degli ultimi 2 caratteri

findPrefix (…$strings): string

Trova l'inizio comune delle stringhe. Oppure restituisce una stringa vuota se non è stato trovato alcun prefisso comune.

Strings::findPrefix('prefix-a', 'prefix-bb', 'prefix-c');   // 'prefix-'
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 parte della stringa $haystack prima della n-esima $nth occorrenza della stringa $needle. Oppure null se $needle non è stato trovato. Con un valore negativo di $nth, la ricerca avviene 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 parte della stringa $haystack dopo la n-esima $nth occorrenza della stringa $needle. Oppure null se $needle non è stato trovato. Con un valore negativo di $nth, la ricerca avviene 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 n-esima $nth occorrenza della stringa $needle nella stringa $haystack. Oppure null se $needle non è stato trovato. Con un valore negativo di $nth, la ricerca avviene 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 dalla stringa i caratteri UTF-8 non validi.

$correctStrings = Strings::fixEncoding($string);

checkEncoding (string $s)bool

Verifica se si tratta di una stringa UTF-8 valida.

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

Utilizzare Nette\Utils\Validator::isUnicode().

toAscii (string $s): string

Converte una stringa UTF-8 in ASCII, ovvero rimuove i diacritici, ecc.

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

Richiede l'estensione PHP intl.

chr (int $code): string

Restituisce un carattere specifico in UTF-8 dal punto di codice (numero nell'intervallo 0×0000..D7FF e 0xE000..10FFFF).

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

ord (string $char): int

Restituisce il punto di codice di un carattere specifico in UTF-8 (numero nell'intervallo 0×0000..D7FF o 0xE000..10FFFF).

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

Espressioni regolari

La classe Strings offre funzioni per lavorare con le espressioni regolari. A differenza delle funzioni PHP native, dispongono di un'API più comprensibile, un migliore supporto Unicode e, soprattutto, il rilevamento degli errori. Qualsiasi errore durante la compilazione o l'elaborazione dell'espressione lancia un'eccezione 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 secondo un'espressione regolare. Le espressioni tra parentesi verranno catturate e restituite anch'esse.

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

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

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

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

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

Se viene specificato $limit, verranno restituite solo le sottostringhe fino al limite e il resto della stringa verrà inserito nell'ultimo elemento. Un limite di –1 o 0 significa nessuna restrizione.

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

Se $utf8 è true, la valutazione passa alla modalità Unicode. Simile a quando si specifica il modificatore u.

Se $captureOffset è true, per ogni corrispondenza trovata verrà restituita anche la sua posizione nella stringa (in byte; se è impostato $utf8, in caratteri). Ciò modifica il valore di ritorno in un array in cui ogni elemento è una coppia composta dalla stringa corrispondente 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]]

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

Cerca nella stringa una parte corrispondente all'espressione regolare e restituisce un array con l'espressione trovata e le singole sottoespressioni, oppure null.

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

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

Se $unmatchedAsNull è true, i sottogruppi non catturati vengono restituiti come null; altrimenti vengono restituiti come stringa vuota o non restituiti:

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

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

Se $utf8 è true, la valutazione passa alla modalità Unicode. Simile a quando si specifica il modificatore u:

Strings::match('žlutý kůň', '~\w+~');
// ['lut']

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

Il parametro $offset può essere utilizzato per specificare la posizione da cui iniziare la ricerca (in byte; se è impostato $utf8, in caratteri).

Se $captureOffset è true, per ogni corrispondenza trovata verrà restituita anche la sua posizione nella stringa (in byte; se è impostato $utf8, in caratteri). Ciò modifica il valore di ritorno in un array in cui ogni elemento è una coppia composta dalla stringa corrispondente e dal suo offset:

Strings::match('žlutý!', '~\w+(!+)?~', captureOffset: true);
// [['lut', 2]]

Strings::match('žlutý!', '~\w+(!+)?~', captureOffset: true, utf8: true);
// [['žlutý!', 0], ['!', 5]]

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 nella stringa tutte le occorrenze corrispondenti all'espressione regolare e restituisce un array di array con l'espressione trovata e le singole sottoespressioni.

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

Se $patternOrder è true, la struttura dei risultati cambia in modo che il primo elemento sia un array di corrispondenze complete del pattern, il secondo sia un array di stringhe corrispondenti al primo sottogruppo tra parentesi, e così via:

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

Se $unmatchedAsNull è true, i sottogruppi non catturati vengono restituiti come null; altrimenti vengono restituiti come stringa vuota o non restituiti:

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

Se $utf8 è true, la valutazione passa alla modalità Unicode. Simile a quando si specifica il 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ò essere utilizzato per specificare la posizione da cui iniziare la ricerca (in byte; se è impostato $utf8, in caratteri).

Se $captureOffset è true, per ogni corrispondenza trovata verrà restituita anche la sua posizione nella stringa (in byte; se è impostato $utf8, in caratteri). Ciò modifica il valore di ritorno in un array in cui ogni elemento è una coppia composta dalla stringa corrispondente e dalla sua 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, il che comporta significativi vantaggi in termini di prestazioni quando si lavora con stringhe di grandi dimensioni. Il generatore consente di cercare le corrispondenze gradualmente, invece dell'intera stringa contemporaneamente. Ciò consente di lavorare in modo efficiente anche con testi di input estremamente grandi. Inoltre, è possibile interrompere l'elaborazione in qualsiasi momento se si trova la corrispondenza cercata, risparmiando tempo di calcolo.

$matches = Strings::matchAll($largeText, '~\w+~', lazy: true);
foreach ($matches as $match) {
    echo "Trovato: $match[0]\n";
    // L'elaborazione può essere interrotta in qualsiasi momento
}

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 corrispondenti all'espressione regolare. $replacement è una maschera di stringa di sostituzione o un callback.

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

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

La funzione consente anche di eseguire più sostituzioni passando un array nel secondo parametro nella forma pattern => replacement:

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

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

Se $utf8 è true, la valutazione passa alla modalità Unicode. Simile a quando si specifica il modificatore u.

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

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

Se $captureOffset è true, per ogni corrispondenza trovata verrà passata al callback anche la sua posizione nella stringa (in byte; se è impostato $utf8, in caratteri). Ciò modifica la forma dell'array passato, dove ogni elemento è una coppia composta dalla stringa corrispondente e dalla sua posizione.

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

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

Se $unmatchedAsNull è true, i sottogruppi non catturati vengono passati al callback come null; altrimenti vengono passati come stringa vuota o non passati:

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

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