Funzioni di stringa

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

Installazione:

composer require nette/utils

Tutti gli esempi presuppongono che sia definito il seguente alias di classe:

use Nette\Utils\Strings;

Lettera Caso

Queste funzioni richiedono l'estensione PHP mbstring.

lower (string $s): string

Converte tutti i caratteri della stringa UTF-8 in minuscolo.

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

upper (string $s): string

Converte tutti i caratteri di una stringa UTF-8 in maiuscole.

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 il primo carattere di ogni parola di una stringa UTF-8 in maiuscolo e gli altri in minuscolo.

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

Modifica di una stringa

normalize (string $s): string

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

unixNewLines (string $s): string

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

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

platformNewLines (string $s)string

Converte le interruzioni di riga in caratteri specifici della piattaforma corrente, ad esempio \r\n su Windows e \n altrove. Le interruzioni di riga sono \n, \r, \r\n, U+2028 separatore di riga, U+2029 separatore di paragrafo.

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

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

Modifica la stringa UTF-8 nella forma usata nell'URL, cioè rimuove i diacritici e sostituisce tutti i caratteri tranne le lettere dell'alfabeto inglese e i numeri con un trattino.

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

Anche altri caratteri possono essere conservati, ma devono essere passati come secondo argomento.

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

Il terzo argomento può sopprimere la conversione della stringa in minuscolo.

Strings::webalize('Hello world', null, false); // 'Hello-world'

Richiede l'estensione PHP intl.

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

Rimuove tutti gli spazi a sinistra e a destra (o i caratteri passati come secondo argomento) da una stringa codificata UTF-8.

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

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

Tronca una stringa UTF-8 alla lunghezza massima indicata, cercando di non dividere le parole intere. Solo se la stringa viene troncata, alla stringa viene aggiunta un'ellissi (o qualcos'altro impostato con il terzo argomento).

$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 $indentationChar=`"\t"`)string

Rientra un testo multilinea da sinistra. Il secondo argomento stabilisce il numero di caratteri di rientro da utilizzare, mentre il rientro stesso è il terzo argomento (tab per impostazione predefinita).

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

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

Imbottisce una stringa UTF-8 alla lunghezza data, anteponendo la stringa $pad all'inizio.

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

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

Imbottisce una stringa UTF-8 alla lunghezza data aggiungendo la stringa $pad alla fine.

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 specificata dalla posizione iniziale $start e dalla lunghezza $length. Se $start è negativo, la stringa restituita inizierà a partire dal $start'esimo carattere dalla fine della stringa.

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

reverse (string $s): string

Inverte la stringa UTF-8.

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

length (string $s): int

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

Si tratta del numero di punti di codice Unicode, che può differire dal numero di grafemi.

Strings::length('Nette'); // 5
Strings::length('red');   // 3

startsWith (string $haystack, string $needle)bool

Controlla se la stringa $haystack inizia con $needle.

$haystack = 'Begins';
$needle = 'Be';
Strings::startsWith($haystack, $needle); // true

Utilizzare il nativo str_starts_with().

endsWith (string $haystack, string $needle)bool

Controlla se la stringa $haystack termina con $needle.

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

Utilizzare str_ends_with() nativo:https://www.php.net/…nds-with.php.

contains (string $haystack, string $needle)bool

Controlla se la stringa $haystack contiene $needle.

$haystack = 'Contains';
$needle = 'tai';
Strings::contains($haystack, $needle); // true

Utilizzare str_contains() nativo :https://www.php.net/…contains.php.

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

Confronta due stringhe UTF-8 o le loro parti, senza tenere conto del caso dei caratteri. Se $length è nullo, vengono confrontate le stringhe intere, se è negativo, viene confrontato il numero corrispondente di caratteri dalla fine delle stringhe, altrimenti viene confrontato il numero appropriato di caratteri dall'inizio.

Strings::compare('Nette', 'nette');     // true
Strings::compare('Nette', 'next', 2);   // true - two first characters match
Strings::compare('Nette', 'Latte', -2); // true - two last characters match

findPrefix (…$strings): string

Trova il prefisso comune delle stringhe o restituisce una stringa vuota se il prefisso non è stato trovato.

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 una parte di $haystack prima dell'occorrenza di $nth in $needle o restituisce null se l'ago non è stato trovato. Il valore negativo indica la ricerca dalla fine.

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 una parte di $haystack dopo l'occorrenza di $nth in $needle o restituisce null se $needle non è stato trovato. Il valore negativo di $nth indica la ricerca dalla fine.

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 di $nth in cui si trova $needle in $haystack o null se $needle non è stato trovato. Il valore negativo di $nth indica la ricerca dalla fine.

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 tutti i caratteri UTF-8 non validi da una stringa.

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

checkEncoding (string $s)bool

Verifica se la stringa è valida nella codifica UTF-8.

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

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

toAscii (string $s): string

Converte le stringhe UTF-8 in ASCII, cioè 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 o 0xE000..10FFFF).

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

ord (string $char): int

Restituisce un 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 fornisce funzioni per lavorare con le espressioni regolari. A differenza delle funzioni native di PHP, hanno un'API più comprensibile, un migliore supporto Unicode e, soprattutto, un rilevamento degli errori. Qualsiasi errore di compilazione o di elaborazione delle espressioni lancerà un'eccezione Nette\RegexpException.

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

Divide la stringa in array in base all'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, 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 nessun limite.

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

Se $utf8 è true, la valutazione passa alla modalità Unicode. Questo è simile alla specificazione del modificatore u.

Se $captureOffset è true, per ogni corrispondenza che si verifica, viene restituita anche la sua posizione nella stringa (in byte; in caratteri se $utf8 è impostato). Questo cambia il valore di ritorno in un array in cui ogni elemento è una coppia composta dalla stringa abbinata 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 la 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, le sottoespressioni non corrispondenti vengono restituite come null; altrimenti vengono restituite come una stringa vuota o non vengono restituite:

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

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

Se $utf8 è true, la valutazione passa alla modalità Unicode. Ciò è simile alla specificazione del modificatore u:

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

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

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

Se $captureOffset è true, per ogni corrispondenza che si verifica, viene restituita anche la sua posizione nella stringa (in byte; in caratteri se $utf8 è impostato). Questo cambia 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 che corrispondono all'espressione regolare e restituisce un array di array contenenti l'espressione trovata e ogni sottoespressione.

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

Se $patternOrder è true, la struttura dei risultati cambia in modo che il primo elemento è un array di corrispondenze complete del modello, il secondo è un array di stringhe corrispondenti alla prima sottoespressione 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 una stringa vuota o non vengono restituiti:

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

Se $utf8 è true, la valutazione passa alla modalità Unicode. Ciò è simile alla specificazione 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ò essere usato per specificare la posizione da cui iniziare la ricerca (in byte; in caratteri se è impostato $utf8 ).

Se $captureOffset è true, per ogni corrispondenza che si verifica, viene restituita anche la sua posizione nella stringa (in byte; in caratteri se $utf8 è impostato). Questo cambia 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, con notevoli vantaggi in termini di prestazioni quando si lavora con stringhe di grandi dimensioni. Il generatore consente di trovare le corrispondenze in modo incrementale, anziché elaborare l'intera stringa in una sola volta. Ciò consente di gestire in modo efficiente testi di input molto grandi. Inoltre, è possibile interrompere l'elaborazione in qualsiasi momento se si trova la corrispondenza desiderata, risparmiando tempo di calcolo.

$matches = Strings::matchAll($largeText, '~\w+~', lazy: true);
foreach ($matches as $match) {
    echo "Found: $match[0]\n";
    // Processing can be interrupted at any time
}

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 all'espressione regolare. Il parametro $replacement è una maschera di stringa sostitutiva o un richiamo.

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

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

La funzione consente anche sostituzioni multiple passando un array della forma pattern => replacement nel secondo parametro:

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

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

Se $utf8 è true, la valutazione passa alla modalità Unicode. Ciò è simile alla specificazione del modificatore u.

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

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

Se $captureOffset è true, per ogni corrispondenza che si verifica, la sua posizione nella stringa (in byte; in caratteri se $utf8 è impostato) viene passata anche al callback. Questo cambia 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]] a [['k', 8]]

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

Se $unmatchedAsNull è true, i sottopattern non abbinati vengono passati alla callback come null; altrimenti vengono passati come una stringa vuota o non vengono 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