Λειτουργίες συμβολοσειράς

Nette\Utils\Strings είναι μια στατική κλάση, η οποία περιέχει πολλές χρήσιμες συναρτήσεις για την εργασία με κωδικοποιημένα αλφαριθμητικά UTF-8.

Εγκατάσταση:

composer require nette/utils

Όλα τα παραδείγματα προϋποθέτουν ότι έχει οριστεί το ακόλουθο ψευδώνυμο κλάσης:

use Nette\Utils\Strings;

Letter Case

Αυτές οι λειτουργίες απαιτούν την επέκταση PHP mbstring.

lower (string $s): string

Μετατρέπει όλους τους χαρακτήρες της συμβολοσειράς UTF-8 σε πεζά γράμματα.

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

upper (string $s): string

Μετατρέπει όλους τους χαρακτήρες μιας συμβολοσειράς UTF-8 σε κεφαλαίους.

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

firstUpper (string $s): string

Μετατρέπει τον πρώτο χαρακτήρα μιας συμβολοσειράς UTF-8 σε κεφαλαίο και αφήνει τους υπόλοιπους χαρακτήρες αμετάβλητους.

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

firstLower (string $s): string

Μετατρέπει τον πρώτο χαρακτήρα μιας συμβολοσειράς UTF-8 σε πεζά και αφήνει τους υπόλοιπους χαρακτήρες αμετάβλητους.

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

capitalize (string $s): string

Μετατρέπει τον πρώτο χαρακτήρα κάθε λέξης μιας συμβολοσειράς UTF-8 σε κεφαλαία και τους υπόλοιπους σε πεζά.

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

Επεξεργασία μιας συμβολοσειράς

normalize (string $s): string

Αφαιρεί τους χαρακτήρες ελέγχου, κανονικοποιεί τα διαλείμματα γραμμής στο \n, αφαιρεί τις κενές γραμμές που προηγούνται και ακολουθούν, κόβει τα κενά στο τέλος των γραμμών, κανονικοποιεί το UTF-8 στην κανονική μορφή του NFC.

unixNewLines (string $s): string

Μετατρέπει τα διαλείμματα γραμμής σε \n που χρησιμοποιούνται στα συστήματα Unix. Τα διαλείμματα γραμμής είναι: \n \r \r\n U+2028 διαχωριστικό γραμμής, U+2029 διαχωριστικό παραγράφου.

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

platformNewLines (string $s)string

Μετατρέπει τα διαχωριστικά γραμμών σε χαρακτήρες που αφορούν την τρέχουσα πλατφόρμα, δηλαδή \r\n στα Windows και \n αλλού. Τα διαλείμματα γραμμής είναι \n, \r, \r\n, U+2028 διαχωριστικό γραμμής, U+2029 διαχωριστικό παραγράφου.

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

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

Τροποποιεί τη συμβολοσειρά UTF-8 στη μορφή που χρησιμοποιείται στη διεύθυνση URL, δηλαδή αφαιρεί τους διακριτικούς χαρακτήρες και αντικαθιστά όλους τους χαρακτήρες εκτός από τα γράμματα του αγγλικού αλφαβήτου και τους αριθμούς με μια παύλα.

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

Μπορούν να διατηρηθούν και άλλοι χαρακτήρες, αλλά πρέπει να μεταβιβαστούν ως δεύτερο όρισμα.

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

Το τρίτο όρισμα μπορεί να εμποδίσει τη μετατροπή της συμβολοσειράς σε πεζά γράμματα.

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

Απαιτεί την επέκταση PHP intl.

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

Αφαιρεί όλα τα αριστερά και δεξιά κενά (ή τους χαρακτήρες που περνούν ως δεύτερο όρισμα) από μια κωδικοποιημένη συμβολοσειρά UTF-8.

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

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

Αποκόπτει μια συμβολοσειρά UTF-8 σε δεδομένο μέγιστο μήκος, ενώ προσπαθεί να μην διασπάσει ολόκληρες λέξεις. Μόνο αν η συμβολοσειρά είναι περικομμένη, μια έλλειψη (ή κάτι άλλο που ορίζεται με το τρίτο όρισμα) προσαρτάται στη συμβολοσειρά.

$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

Παρεμβάλλει ένα κείμενο πολλών γραμμών από τα αριστερά. Το δεύτερο όρισμα ορίζει πόσα σύμβολα εσοχής θα χρησιμοποιηθούν, ενώ η ίδια η εσοχή είναι το τρίτο όρισμα (tab από προεπιλογή).

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

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

Γεμίζει μια συμβολοσειρά UTF-8 στο δεδομένο μήκος, προτάσσοντας τη συμβολοσειρά $pad στην αρχή.

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

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

Στερεοποιεί τη συμβολοσειρά UTF-8 στο δεδομένο μήκος, προσθέτοντας τη συμβολοσειρά $pad στο τέλος.

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

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

Επιστρέφει ένα τμήμα της συμβολοσειράς UTF-8 που καθορίζεται από τη θέση έναρξης $start και το μήκος $length. Εάν το $start είναι αρνητικό, το επιστρεφόμενο αλφαριθμητικό θα ξεκινήσει από τον $start'οστό χαρακτήρα από το τέλος του αλφαριθμητικού.

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.

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

length (string $s): int

Επιστρέφει τον αριθμό των χαρακτήρων (όχι bytes) στη συμβολοσειρά UTF-8.

Δηλαδή τον αριθμό των κωδικών σημείων Unicode, ο οποίος μπορεί να διαφέρει από τον αριθμό των γραφημάτων.

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

startsWith (string $haystack, string $needle)bool

Ελέγχει αν η συμβολοσειρά $haystack αρχίζει με $needle.

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

Χρησιμοποιεί το εγγενές str_starts_with().

endsWith (string $haystack, string $needle)bool

Ελέγχει αν η συμβολοσειρά $haystack τελειώνει με $needle.

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

Χρησιμοποιεί το εγγενές str_ends_with().

contains (string $haystack, string $needle)bool

Ελέγχει αν η συμβολοσειρά $haystack περιέχει το $needle.

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

Χρήση εγγενούς str_contains().

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

Συγκρίνει δύο συμβολοσειρές UTF-8 ή τα μέρη τους, χωρίς να λαμβάνει υπόψη την περίπτωση χαρακτήρων. Αν $length είναι null, συγκρίνονται ολόκληρες συμβολοσειρές, αν είναι αρνητικό, συγκρίνεται ο αντίστοιχος αριθμός χαρακτήρων από το τέλος των συμβολοσειρών, διαφορετικά συγκρίνεται ο αντίστοιχος αριθμός χαρακτήρων από την αρχή.

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

Βρίσκει το κοινό πρόθεμα των συμβολοσειρών ή επιστρέφει κενή συμβολοσειρά εάν το πρόθεμα δεν βρέθηκε.

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

Επιστρέφει μέρος του $haystack πριν από την εμφάνιση του $nth στο $needle ή επιστρέφει το null εάν δεν βρέθηκε η βελόνα. Αρνητική τιμή σημαίνει αναζήτηση από το τέλος.

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 μετά την εμφάνιση του $nth στο $needle ή επιστρέφει το null εάν το $needle δεν βρέθηκε. Αρνητική τιμή του $nth σημαίνει αναζήτηση από το τέλος.

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

Επιστρέφει τη θέση σε χαρακτήρες του $nth εμφάνισης του $needle στο $haystack ή στο null εάν το $needle δεν βρέθηκε. Αρνητική τιμή του $nth σημαίνει αναζήτηση από το τέλος.

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

Κωδικοποίηση

fixEncoding (string $s): string

Αφαιρεί όλους τους μη έγκυρους χαρακτήρες UTF-8 από μια συμβολοσειρά.

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

checkEncoding (string $s)bool

Ελέγχει αν η συμβολοσειρά είναι έγκυρη σε κωδικοποίηση UTF-8.

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

Χρησιμοποιήστε την Nette\Utils\Validator::isUnicode().

toAscii (string $s): string

Μετατρέπει τη συμβολοσειρά UTF-8 σε ASCII, δηλαδή αφαιρεί τα διακριτικά κ.λπ.

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

Απαιτεί την επέκταση PHP intl.

chr (int $code): string

Επιστρέφει έναν συγκεκριμένο χαρακτήρα σε UTF-8 από το σημείο κωδικού (αριθμός στην περιοχή 0×0000..D7FF ή 0xE000..10FFFF).

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

ord (string $char): int

Επιστρέφει ένα σημείο κωδικού από συγκεκριμένο χαρακτήρα σε UTF-8 (αριθμός στην περιοχή 0×0000..D7FF ή 0xE000..10FFFF).

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

Κανονικές εκφράσεις

Η κλάση Strings παρέχει συναρτήσεις για την εργασία με κανονικές εκφράσεις. Σε αντίθεση με τις εγγενείς συναρτήσεις της PHP, έχουν ένα πιο κατανοητό API, καλύτερη υποστήριξη Unicode και, το σημαντικότερο, ανίχνευση σφαλμάτων. Οποιοδήποτε σφάλμα μεταγλώττισης ή επεξεργασίας εκφράσεων θα πετάξει μια εξαίρεση Nette\RegexpException.

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

Χωρίζει τη συμβολοσειρά σε πίνακες σύμφωνα με την κανονική έκφραση. Οι εκφράσεις σε παρενθέσεις θα καταγραφούν και θα επιστραφούν επίσης.

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

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

Εάν $skipEmpty είναι true, θα επιστραφούν μόνο μη κενά στοιχεία:

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

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

Εάν καθοριστεί το $limit, θα επιστραφούν μόνο υποσύνολα μέχρι το όριο και το υπόλοιπο της συμβολοσειράς θα τοποθετηθεί στο τελευταίο στοιχείο. Ένα όριο –1 ή 0 σημαίνει ότι δεν υπάρχει όριο.

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

Εάν $utf8 είναι true, η αξιολόγηση μεταβαίνει σε λειτουργία Unicode. Αυτό είναι παρόμοιο με τον προσδιορισμό του τροποποιητή u.

Εάν $captureOffset είναι true, για κάθε εμφανιζόμενη αντιστοιχία, θα επιστραφεί επίσης η θέση της στη συμβολοσειρά (σε bytes- σε χαρακτήρες εάν έχει οριστεί $utf8 ). Αυτό αλλάζει την τιμή επιστροφής σε έναν πίνακα όπου κάθε στοιχείο είναι ένα ζεύγος αποτελούμενο από το αλφαριθμητικό που ταιριάζει και τη θέση του.

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

Ψάχνει τη συμβολοσειρά για το τμήμα που ταιριάζει με την κανονική έκφραση και επιστρέφει έναν πίνακα με την έκφραση που βρέθηκε και τις επιμέρους υποεκφράσεις ή null.

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

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

Εάν το $unmatchedAsNull είναι true, τα μη ταιριαστά υποδείγματα επιστρέφονται ως null- διαφορετικά επιστρέφονται ως κενή συμβολοσειρά ή δεν επιστρέφονται:

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

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

Εάν $utf8 είναι true, η αξιολόγηση μεταβαίνει σε λειτουργία Unicode. Αυτό είναι παρόμοιο με τον προσδιορισμό του τροποποιητή u:

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

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

Η παράμετρος $offset μπορεί να χρησιμοποιηθεί για να καθορίσει τη θέση από την οποία θα ξεκινήσει η αναζήτηση (σε bytes- σε χαρακτήρες αν έχει οριστεί το $utf8 ).

Εάν $captureOffset είναι true, για κάθε εμφανιζόμενη αντιστοιχία, θα επιστρέφεται επίσης η θέση της στη συμβολοσειρά (σε bytes- σε χαρακτήρες εάν έχει οριστεί $utf8 ). Αυτό αλλάζει την τιμή επιστροφής σε έναν πίνακα όπου κάθε στοιχείο είναι ένα ζεύγος αποτελούμενο από το αλφαριθμητικό που ταιριάζει και τη μετατόπισή του:

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

Ψάχνει τη συμβολοσειρά για όλες τις εμφανίσεις που ταιριάζουν με την κανονική έκφραση και επιστρέφει έναν πίνακα πινάκων που περιέχει την έκφραση που βρέθηκε και κάθε υποέκφραση.

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

Εάν $patternOrder είναι true, η δομή των αποτελεσμάτων αλλάζει έτσι ώστε το πρώτο στοιχείο να είναι ένας πίνακας με πλήρεις αντιστοιχίες προτύπων, ο δεύτερος είναι ένας πίνακας με συμβολοσειρές που αντιστοιχούν στο πρώτο υποπρότυπο σε παρένθεση κ.ο.κ:

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

Εάν $unmatchedAsNull είναι true, τα υποδείγματα που δεν ταιριάζουν επιστρέφονται ως null- διαφορετικά επιστρέφονται ως κενή συμβολοσειρά ή δεν επιστρέφονται:

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

Εάν $utf8 είναι true, η αξιολόγηση μεταβαίνει σε λειτουργία Unicode. Αυτό είναι παρόμοιο με τον προσδιορισμό του τροποποιητή u:

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

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

Η παράμετρος $offset μπορεί να χρησιμοποιηθεί για να καθορίσει τη θέση από την οποία θα ξεκινήσει η αναζήτηση (σε bytes- σε χαρακτήρες αν έχει οριστεί το $utf8 ).

Εάν $captureOffset είναι true, για κάθε εμφανιζόμενη αντιστοιχία, θα επιστρέφεται επίσης η θέση της στη συμβολοσειρά (σε bytes- σε χαρακτήρες εάν έχει οριστεί $utf8 ). Αυτό αλλάζει την τιμή επιστροφής σε έναν πίνακα όπου κάθε στοιχείο είναι ένα ζεύγος που αποτελείται από το αλφαριθμητικό που ταιριάζει και τη θέση του:

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, η συνάρτηση επιστρέφει ένα Generator αντί για έναν πίνακα, γεγονός που παρέχει σημαντικά οφέλη στην απόδοση όταν εργάζεστε με μεγάλες συμβολοσειρές. Η γεννήτρια επιτρέπει τη σταδιακή εύρεση αντιστοιχιών, αντί να επεξεργάζεται ολόκληρη τη συμβολοσειρά με τη μία. Αυτό επιτρέπει τον αποτελεσματικό χειρισμό εξαιρετικά μεγάλων κειμένων εισόδου. Επιπλέον, μπορείτε να διακόψετε την επεξεργασία ανά πάσα στιγμή εάν βρείτε την επιθυμητή αντιστοιχία, εξοικονομώντας υπολογιστικό χρόνο.

$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

Αντικαθιστά όλες τις εμφανίσεις που ταιριάζουν με την κανονική έκφραση. Το $replacement είναι είτε μια μάσκα συμβολοσειράς αντικατάστασης είτε μια επανάκληση.

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

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

Η συνάρτηση επιτρέπει επίσης πολλαπλές αντικαταστάσεις περνώντας στη δεύτερη παράμετρο έναν πίνακα της μορφής pattern => replacement:

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

Η παράμετρος $limit περιορίζει τον αριθμό των αντικαταστάσεων. Το όριο –1 σημαίνει ότι δεν υπάρχει όριο.

Εάν $utf8 είναι true, η αξιολόγηση μεταβαίνει σε λειτουργία Unicode. Αυτό είναι παρόμοιο με τον προσδιορισμό του τροποποιητή u.

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

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

Εάν $captureOffset είναι true, για κάθε εμφανιζόμενη αντιστοιχία, η θέση της στη συμβολοσειρά (σε bytes- σε χαρακτήρες εάν έχει οριστεί το $utf8 ) μεταβιβάζεται επίσης στο callback. Αυτό αλλάζει τη μορφή του περασμένου πίνακα, όπου κάθε στοιχείο είναι ένα ζεύγος που αποτελείται από το αλφαριθμητικό που ταιριάζει και τη θέση του.

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]]

Εάν το $unmatchedAsNull είναι true, τα μη ταιριασμένα υποδείγματα μεταβιβάζονται στο callback ως null- διαφορετικά μεταβιβάζονται ως κενή συμβολοσειρά ή δεν μεταβιβάζονται:

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']
έκδοση: 4.0