Arbeiten mit Zeichenketten

Nette\Utils\Strings ist eine statische Klasse mit nützlichen Funktionen für die Arbeit mit Zeichenketten, hauptsächlich in UTF-8-Kodierung.

Installation:

composer require nette/utils

Alle Beispiele setzen voraus, dass ein Alias erstellt wurde:

use Nette\Utils\Strings;

Änderung der Groß-/Kleinschreibung

Diese Funktionen erfordern die PHP-Erweiterung mbstring.

lower (string $s): string

Konvertiert einen UTF-8-String in Kleinbuchstaben.

Strings::lower('Guten Tag'); // 'guten tag'

upper (string $s): string

Konvertiert einen UTF-8-String in Großbuchstaben.

Strings::upper('Guten Tag'); // 'GUTEN TAG'

firstUpper (string $s): string

Konvertiert den ersten Buchstaben eines UTF-8-Strings in einen Großbuchstaben, die anderen bleiben unverändert.

Strings::firstUpper('guten tag'); // 'Guten tag'

firstLower (string $s): string

Konvertiert den ersten Buchstaben eines UTF-8-Strings in einen Kleinbuchstaben, die anderen bleiben unverändert.

Strings::firstLower('Guten Tag'); // 'guten Tag'

capitalize (string $s): string

Konvertiert den ersten Buchstaben jedes Wortes in einem UTF-8-String in einen Großbuchstaben, die anderen in Kleinbuchstaben.

Strings::capitalize('Guten Tag'); // 'Guten Tag'

Bearbeitung von Zeichenketten

normalize (string $s): string

Entfernt Steuerzeichen, normalisiert Zeilenenden auf \n, entfernt führende und nachfolgende leere Zeilen, entfernt nachfolgende Leerzeichen in Zeilen, normalisiert UTF-8 auf die Normalform NFC.

unixNewLines (string $s): string

Konvertiert Zeilenenden in \n, die in Unix-Systemen verwendet werden. Zeilenenden sind: \n, \r, \r\n, U+2028 line separator, U+2029 paragraph separator.

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

platformNewLines (string $s)string

Konvertiert Zeilenenden in die für die aktuelle Plattform spezifischen Zeichen, d.h. \r\n unter Windows und \n anderswo. Zeilenenden sind: \n, \r, \r\n, U+2028 line separator, U+2029 paragraph separator.

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

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

Modifiziert einen UTF-8-String in eine Form, die in URLs verwendet wird, d.h. entfernt Diakritika und ersetzt alle Zeichen außer Buchstaben des englischen Alphabets und Ziffern durch Bindestriche.

Strings::webalize('unser produkt'); // 'unser-produkt'

Sollen auch andere Zeichen beibehalten werden, können diese im zweiten Parameter der Funktion angegeben werden.

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

Mit dem dritten Parameter kann die Konvertierung in Kleinbuchstaben unterdrückt werden.

Strings::webalize('Guten Tag', null, false); // 'Guten-Tag'

Erfordert die PHP-Erweiterung intl.

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

Entfernt Leerzeichen (oder andere im zweiten Parameter angegebene Zeichen) vom Anfang und Ende eines UTF-8-Strings.

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

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

Kürzt einen UTF-8-String auf die angegebene maximale Länge, wobei versucht wird, ganze Wörter beizubehalten. Wenn der String gekürzt wird, wird am Ende ein Dreipunkt hinzugefügt (kann durch den dritten Parameter geändert werden).

$text = 'Sagen Sie, wie geht es Ihnen?';
Strings::truncate($text, 5);       // 'Sagen…'
Strings::truncate($text, 20);      // 'Sagen Sie, wie geht…'
Strings::truncate($text, 30);      // 'Sagen Sie, wie geht es Ihnen?'
Strings::truncate($text, 20, '~'); // 'Sagen Sie, wie geht~'

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

Rückt einen mehrzeiligen Text von links ein. Die Anzahl der Einrückungen wird durch den zweiten Parameter bestimmt, womit eingerückt wird, durch den dritten Parameter (Standardwert ist Tabulator).

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

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

Füllt einen UTF-8-String auf die angegebene Länge auf, indem der String $pad von links wiederholt wird.

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

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

Füllt einen UTF-8-String auf die angegebene Länge auf, indem der String $pad von rechts wiederholt wird.

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

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

Gibt einen Teil des UTF-8-Strings $s zurück, der durch die Startposition $start und die Länge $length angegeben wird. Wenn $start negativ ist, beginnt der zurückgegebene String beim -$start`-ten Zeichen vom Ende.

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

reverse (string $s): string

Kehrt einen UTF-8-String um.

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

length (string $s): int

Gibt die Anzahl der Zeichen (nicht Bytes) in einem UTF-8-String zurück.

Dies ist die Anzahl der Unicode-Codepunkte, die sich von der Anzahl der Grapheme unterscheiden kann.

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

startsWith (string $haystack, string $needle)bool

Stellt fest, ob der String $haystack mit dem String $needle beginnt.

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

Verwenden Sie die native Funktion str_starts_with().

endsWith (string $haystack, string $needle)bool

Stellt fest, ob der String $haystack mit dem String $needle endet.

$haystack = 'Endet';
$needle = 'det';
Strings::endsWith($haystack, $needle); // true

Verwenden Sie die native Funktion str_ends_with().

contains (string $haystack, string $needle)bool

Stellt fest, ob der String $haystack $needle enthält.

$haystack = 'Hörsaal';
$needle = 'saal';
Strings::contains($haystack, $needle); // true

Verwenden Sie die native Funktion str_contains().

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

Vergleicht zwei UTF-8-Strings oder Teile davon ohne Berücksichtigung der Groß-/Kleinschreibung. Wenn $length null enthält, werden die gesamten Strings verglichen, wenn es negativ ist, wird die entsprechende Anzahl von Zeichen vom Ende der Strings verglichen, andernfalls wird die entsprechende Anzahl von Zeichen vom Anfang verglichen.

Strings::compare('Nette', 'nette');     // true
Strings::compare('Nette', 'next', 2);   // true - Übereinstimmung der ersten 2 Zeichen
Strings::compare('Nette', 'Latte', -2); // true - Übereinstimmung der letzten 2 Zeichen

findPrefix (…$strings): string

Findet den gemeinsamen Anfang von Strings. Oder gibt einen leeren String zurück, wenn kein gemeinsames Präfix gefunden wurde.

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

Gibt den Teil des Strings $haystack vor dem n-ten $nth Vorkommen des Strings $needle zurück. Oder null, wenn $needle nicht gefunden wurde. Bei einem negativen Wert von $nth wird vom Ende des Strings gesucht.

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

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

Gibt den Teil des Strings $haystack nach dem n-ten $nth Vorkommen des Strings $needle zurück. Oder null, wenn $needle nicht gefunden wurde. Bei einem negativen Wert von $nth wird vom Ende des Strings gesucht.

Strings::after('Nette_ist_großartig', '_', 2);  // 'großartig'
Strings::after('Nette_ist_großartig', '_', -1); // 'großartig'
Strings::after('Nette_ist_großartig', ' ');     // null
Strings::after('Nette_ist_großartig', '_', 3);  // null

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

Gibt die Position in Zeichen des n-ten $nth Vorkommens des Strings $needle im String $haystack zurück. Oder null, wenn $needle nicht gefunden wurde. Bei einem negativen Wert von $nth wird vom Ende des Strings gesucht.

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

Kodierung

fixEncoding (string $s): string

Entfernt ungültige UTF-8-Zeichen aus dem String.

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

checkEncoding (string $s)bool

Stellt fest, ob es sich um einen gültigen UTF-8-String handelt.

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

Verwenden Sie Nette\Utils\Validator::isUnicode().

toAscii (string $s): string

Konvertiert einen UTF-8-String in ASCII, d.h. entfernt Diakritika usw.

Strings::toAscii('gelbes Pferd'); // 'gelbes Pferd' (Annahme: Original war 'žluťoučký kůň')

Erfordert die PHP-Erweiterung intl.

chr (int $code): string

Gibt ein spezifisches Zeichen in UTF-8 aus einem Codepunkt zurück (Zahl im Bereich 0×0000..D7FF und 0xE000..10FFFF).

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

ord (string $char): int

Gibt den Codepunkt eines spezifischen Zeichens in UTF-8 zurück (Zahl im Bereich 0×0000..D7FF oder 0xE000..10FFFF).

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

Reguläre Ausdrücke

Die Klasse Strings bietet Funktionen für die Arbeit mit regulären Ausdrücken. Im Gegensatz zu nativen PHP-Funktionen verfügen sie über eine verständlichere API, bessere Unterstützung für Unicode und vor allem Fehlererkennung. Jeder Fehler bei der Kompilierung oder Verarbeitung eines Ausdrucks wirft eine Ausnahme Nette\RegexpException.

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

Teilt einen String anhand eines regulären Ausdrucks in ein Array auf. Ausdrücke in Klammern werden ebenfalls erfasst und zurückgegeben.

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

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

Wenn $skipEmpty true ist, werden nur nicht leere Elemente zurückgegeben:

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

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

Wenn $limit angegeben ist, werden nur Teilstrings bis zum Limit zurückgegeben, und der Rest des Strings wird im letzten Element platziert. Ein Limit von –1 oder 0 bedeutet keine Beschränkung.

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

Wenn $utf8 true ist, wird die Auswertung in den Unicode-Modus umgeschaltet. Ähnlich wie bei der Angabe des Modifikators u.

Wenn $captureOffset true ist, wird für jede gefundene Übereinstimmung auch ihre Position im String zurückgegeben (in Bytes; wenn $utf8 gesetzt ist, in Zeichen). Dies ändert den Rückgabewert in ein Array, bei dem jedes Element ein Paar aus dem übereinstimmenden String und seiner Position ist.

Strings::split('gelb, Pferd', '~,\s*~', captureOffset: true);
// [['gelb', 0], ['Pferd', 7]] (Annahme: Original war 'žlutý, kůň')

Strings::split('gelb, Pferd', '~,\s*~', captureOffset: true, utf8: true);
// [['gelb', 0], ['Pferd', 6]] (Annahme: Original war 'žlutý, kůň')

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

Sucht im String nach einem Teil, der dem regulären Ausdruck entspricht, und gibt ein Array mit dem gefundenen Ausdruck und einzelnen Teilausdrücken zurück, oder null.

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

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

Wenn $unmatchedAsNull true ist, werden nicht erfasste Teilausdrücke als null zurückgegeben; andernfalls werden sie als leerer String zurückgegeben oder nicht zurückgegeben:

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

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

Wenn $utf8 true ist, wird die Auswertung in den Unicode-Modus umgeschaltet. Ähnlich wie bei der Angabe des Modifikators u:

Strings::match('gelbes Pferd', '~\w+~');
// ['gelbes'] (Annahme: Original war 'žlutý kůň', Standard PCRE ohne u)

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

Der Parameter $offset kann verwendet werden, um die Position anzugeben, ab der die Suche beginnen soll (in Bytes; wenn $utf8 gesetzt ist, in Zeichen).

Wenn $captureOffset true ist, wird für jede gefundene Übereinstimmung auch ihre Position im String zurückgegeben (in Bytes; wenn $utf8 gesetzt ist, in Zeichen). Dies ändert den Rückgabewert in ein Array, bei dem jedes Element ein Paar aus dem übereinstimmenden String und seinem Offset ist:

Strings::match('gelbes!', '~\w+(!+)?~', captureOffset: true);
// [['gelbes!', 0], ['!', 6]] (Annahme: Original war 'žlutý!', Standard PCRE ohne u)

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

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

Sucht im String nach allen Vorkommen, die dem regulären Ausdruck entsprechen, und gibt ein Array von Arrays mit dem gefundenen Ausdruck und einzelnen Teilausdrücken zurück.

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

Wenn $patternOrder true ist, ändert sich die Struktur der Ergebnisse so, dass im ersten Eintrag ein Array der vollständigen Musterübereinstimmungen steht, im zweiten ein Array der Strings, die dem ersten geklammerten Teilausdruck entsprechen, und so weiter:

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

Wenn $unmatchedAsNull true ist, werden nicht erfasste Teilausdrücke als null zurückgegeben; andernfalls werden sie als leerer String zurückgegeben oder nicht zurückgegeben:

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

Wenn $utf8 true ist, wird die Auswertung in den Unicode-Modus umgeschaltet. Ähnlich wie bei der Angabe des Modifikators u:

Strings::matchAll('gelbes Pferd', '~\w+~');
/* [
	0 => ['gelbes'],
	1 => ['Pferd'],
] */ // Annahme: Original 'žlutý kůň', Standard PCRE ohne u

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

Der Parameter $offset kann verwendet werden, um die Position anzugeben, ab der die Suche beginnen soll (in Bytes; wenn $utf8 gesetzt ist, in Zeichen).

Wenn $captureOffset true ist, wird für jede gefundene Übereinstimmung auch ihre Position im String zurückgegeben (in Bytes; wenn $utf8 gesetzt ist, in Zeichen). Dies ändert den Rückgabewert in ein Array, bei dem jedes Element ein Paar aus dem übereinstimmenden String und seiner Position ist:

Strings::matchAll('gelbes Pferd', '~\w+~', captureOffset: true);
/* [
	0 => [['gelbes', 0]],
	1 => [['Pferd', 7]],
] */ // Annahme: Original 'žlutý kůň', Standard PCRE ohne u

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

Wenn $lazy true ist, gibt die Funktion einen Generator anstelle eines Arrays zurück, was erhebliche Leistungsvorteile bei der Arbeit mit großen Strings bringt. Der Generator ermöglicht die schrittweise Suche nach Übereinstimmungen, anstatt den gesamten String auf einmal zu verarbeiten. Dies ermöglicht die effiziente Verarbeitung auch extrem großer Eingabetexte. Darüber hinaus können Sie die Verarbeitung jederzeit unterbrechen, wenn Sie die gesuchte Übereinstimmung finden, was Rechenzeit spart.

$matches = Strings::matchAll($largeText, '~\w+~', lazy: true);
foreach ($matches as $match) {
    echo "Gefunden: $match[0]\n";
    // Die Verarbeitung kann jederzeit unterbrochen werden
}

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

Ersetzt alle Vorkommen, die dem regulären Ausdruck entsprechen. $replacement ist entweder eine Maske für den Ersatzstring oder ein Callback.

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

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

Die Funktion ermöglicht auch die Durchführung mehrerer Ersetzungen, indem im zweiten Parameter ein Array im Format pattern => replacement übergeben wird:

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

Der Parameter $limit begrenzt die Anzahl der durchgeführten Ersetzungen. Ein Limit von –1 bedeutet keine Beschränkung.

Wenn $utf8 true ist, wird die Auswertung in den Unicode-Modus umgeschaltet. Ähnlich wie bei der Angabe des Modifikators u.

Strings::replace('gelbes Pferd', '~\w+~', '--');
// '-- --' (Annahme: Original 'žlutý kůň', Standard PCRE ohne u)

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

Wenn $captureOffset true ist, wird für jede gefundene Übereinstimmung auch ihre Position im String an den Callback übergeben (in Bytes; wenn $utf8 gesetzt ist, in Zeichen). Dies ändert die Form des übergebenen Arrays, bei dem jedes Element ein Paar aus dem übereinstimmenden String und seiner Position ist.

Strings::replace(
	'gelbes Pferd',
	'~\w+~',
	function (array $m) { dump($m); return ''; },
	captureOffset: true,
);
// dumps [['gelbes', 0]] und [['Pferd', 7]] (Annahme: Original 'žlutý kůň', Standard PCRE ohne u)

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

Wenn $unmatchedAsNull true ist, werden nicht erfasste Teilausdrücke als null an den Callback übergeben; andernfalls werden sie als leerer String übergeben oder nicht übergeben:

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']
Version: 4.0