Πρόσφατες συζητήσεις Γλώσσα PHPσχετικά με τη Habré έρχονται περισσότερο στην ικανότητα σχεδιασμού σύνθετων συστημάτων, κάτι που είναι καλά νέα. Ωστόσο, αφού εξέτασα μια ντουζίνα από τα πιο αναγνωρισμένα πλαίσια ιστού (Zend Framework, Adept, CakePHP, CodeIgniter, LIMB, Symfony, MZZ και άλλα), με έκπληξη βρήκα μερικές σημαντικές ελλείψεις όσον αφορά τη στοιχειώδη βελτιστοποίηση.

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

Λοιπόν, ας πάμε… Το έργο είναι εξαιρετικά απλό: να διεξάγουμε πειράματα σχετικά με την ταχύτητα σχηματισμού χορδών από υποσυμβολοσειρές σε μονά και διπλά εισαγωγικά. Κατ' αρχήν, αυτό το ερώτημα θα εξακολουθεί να είναι επίκαιρο για πολύ καιρόλόγω των ιδιαιτεροτήτων της επεξεργασίας συμβολοσειρών στην PHP.

Υπάρχουν πολλά άρθρα σχετικά με τη βασική βελτιστοποίηση σεναρίων τόσο στα ρωσικά όσο και σε άλλες γλώσσες. Λίγα λέγονται για τις συμβολοσειρές, αλλά σημειώνεται το γεγονός της "ανάλυσης" συμβολοσειρών σε διπλά εισαγωγικά για μεταβλητές και χαρακτήρες ελέγχου (ωστόσο, όπως στην επίσημη τεκμηρίωση). Με βάση αυτό, είναι λογικό να υποθέσουμε ότι η χρήση συμβολοσειρών με διπλά εισαγωγικά στην εργασία θα είναι κάπως πιο αργή από τις ίδιες πράξεις με δευτερεύουσες συμβολοσειρές.

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

Η μόνη προσθήκη πριν σας παρουσιάσω τον κώδικα σεναρίου δοκιμής: πρέπει να λάβετε υπόψη το 2 πιθανές επιλογέςεργασία με συμβολοσειρές σε διπλά εισαγωγικά: λαμβάνοντας υπόψη το απλό και "προηγμένο" στυλ κωδικοποίησης. Το γεγονός ότι οι μεταβλητές βρίσκονται στην αρχή των γραμμών μάλλον δεν αξίζει να προσέξουμε - είναι μόνο παραδείγματα:
$string = "$_SERVER["HTTP_HOST"] δεν είναι η διοίκηση της περιοχής Ulyanovsk. Αγαπάμε τη ρωσική γλώσσα και δεν μας αρέσουν όσοι τη μιλούν..."
και
$string = "($_SERVER["HTTP_HOST"]) δεν είναι η διοίκηση της περιοχής του Ουλιάνοφσκ. Αγαπάμε τη ρωσική γλώσσα και δεν μας αρέσουν όσοι τη μιλούν..."

Τεστ νούμερο ένα.
Λοιπόν, φαίνεται ότι έχουν γίνει όλες οι κρατήσεις - ήρθε η ώρα να δείξουμε τα αποτελέσματα της δουλειάς. Πηγήμπορεί να βρεθεί δοκιμαστής.

Τα στιγμιότυπα οθόνης δείχνουν ότι η υπόθεσή μου δεν επιβεβαιώθηκε. Η υπόθεση για την εργασία με χορδές μέσω του sprintf αποδείχθηκε η μόνη σωστή. Οι πιο γρήγορες ήταν οι λειτουργίες με τις οποίες λειτουργούν διπλά εισαγωγικά.

Μετά από έναν σύντομο προβληματισμό για την κατάσταση, η εξήγηση ήρθε από μόνη της: το όλο θέμα είναι ότι η συμβολοσειρά αναφοράς στην οποία έγιναν οι αντικαταστάσεις είναι πολύ σύντομη: ο αναλυτής που διέρχεται από μια τέτοια συμβολοσειρά είναι ασήμαντο θέμα. Ωστόσο, ακόμη και εδώ είναι σαφές ότι η εγγενής αντικατάσταση μιας μεταβλητής σε μια συμβολοσειρά δίνει ένα πλεονέκτημα έναντι του "προχωρημένου στυλ".
Αυτή είναι και η αδυναμία της προσέγγισης συνένωσης: ο όγκος των εισαγόμενων δεδομένων υπερβαίνει τον όγκο των υποσυμβολοσειρών. Από πού προέρχονται τα γενικά έξοδα μπορείτε να το διαβάσετε στο ήδη αναφερόμενο αβρατόπιο.

Ωστόσο, ακόμη και αυτές οι σκέψεις έπρεπε να επιβεβαιωθούν. Για αυτό χρειάστηκε ένα δεύτερο τεστ με αλλαγές στους πιθανούς λόγους που αναφέρθηκαν για μια τέτοια απρόβλεπτη (για μένα) συμπεριφορά. Προφανώς, πολλά πράγματα έχουν τροποποιηθεί στην πέμπτη έκδοση (ομολογώ ότι στην πέμπτη έκδοση της php έκανα μόνο 1 δοκιμή: να παρακάμψω στοιχεία πίνακα).

Δοκιμή νούμερο δύο.
Η δεύτερη υπόθεση είναι ότι η επιμήκυνση της συμβολοσειράς αναφοράς θα αυξήσει τελικά το ποσοστό των συναρτήσεων δοκιμής που σχετίζονται με το σχηματισμό συμβολοσειρών σε διπλά εισαγωγικά, σε σχέση με τα αποτελέσματα της δοκιμής με αριθμό 1. Η ίδια κατάσταση, θεωρητικά, θα πρέπει να παρατηρηθεί σε σχέση με τη λειτουργία της συνάρτησης sprintf. Αυτό οφείλεται, πρώτα απ 'όλα, στην ανάγκη για ανάλυση συμβολοσειρών και στην αύξηση του χρόνου που αφιερώνεται σε αυτήν. Στην περίπτωση με τη συνένωση υποσυμβολοσειρών σε μεμονωμένα εισαγωγικά, νομίζω ότι το αποτέλεσμα θα είναι περίπου το ίδιο με το πρώτο τεστ, το οποίο θα δώσει μια μικρή μείωση στο ποσοστό του χρόνου εκτέλεσης της συνάρτησης quotes_3() μέχρι τη στιγμή ολόκληρου του σεναρίου (αλλά όχι αύξηση της απόδοσης).

Συμπεράσματα, στην πραγματικότητα, μόνο θετικά και επιβεβαιώνουν την υπόθεση. Όταν η συμβολοσειρά αναφοράς είναι ελαφρώς αυξημένη, υπάρχει μεγάλο φορτίο, το οποίο οδηγεί σε πτώση της απόδοσης των διπλών εισαγωγικών και των συναρτήσεων sprintf.

Η υπόθεση σχετικά με τις συμβολοσειρές σε μονά εισαγωγικά αποδείχθηκε επίσης σωστή: αντί για 36,75% του χρόνου στην πρώτη δοκιμή, στη δεύτερη, η συνάρτηση quotes_3() πήρε το 33,76% του χρόνου εκτέλεσης του σεναρίου

πρακτική αξία.
Με απλά λόγια, αφαιρώντας από τα δεδομένα, μπορούμε να συμπεράνουμε: τι μεγαλύτερη χορδή, στην οποία είναι απαραίτητο να γίνει αντικατάσταση, τόσο πιο πιθανό είναι η λειτουργία συνένωσης να ολοκληρωθεί γρηγορότερα από την αναζήτηση μιας μεταβλητής σε διπλά εισαγωγικά. Οι εθελοντές μπορούν να προσπαθήσουν να επιλέξουν τις απαραίτητες παραμέτρους εισαγωγής (αριθμός μεταβλητών, μήκος της συμβολοσειράς αναφοράς, μήκη συμβολοσειρών στις μεταβλητές) έτσι ώστε να ικανοποιούν την ισότητα των χρόνων εκτέλεσης.

Αυτό, στην πραγματικότητα, είναι όλο. Μένει μόνο να προσθέσουμε ότι δεν υπάρχουν μικροπράγματα στον προγραμματισμό (αυτό είναι για όσους θέλουν να πουν "εξοικονόμηση σε αγώνες" (γ) Adelf). Γνωρίζοντας τέτοιες λεπτότητες και λαμβάνοντας υπόψη τους, μπορείτε να γράψετε κώδικα που θα βελτιστοποιηθεί σε όλα τα επίπεδά του.)

ΥΣΤΕΡΟΓΡΑΦΟ:
Δοκιμές που πραγματοποιήθηκαν χρησιμοποιώντας το Zend Studio For Eclipse 6.0.0 (περιλαμβάνεται ο εντοπισμός σφαλμάτων + το πρόγραμμα προφίλ).
Έκδοση PHP 5.2.5
Debian Linux OS

ΥΣΤΕΡΟΓΡΑΦΟ:
Θα χαιρόμουν αν κάποιος δημοσιεύσει τα αποτελέσματά του από αυτές τις δοκιμές. Νομίζω ότι αυτό θα επιτρέψει μια πιο αντικειμενική αξιολόγηση της ανάγκης χρήσης μιας ή άλλης μεθόδου αντικατάστασης σε χορδές. Θα ήμουν επίσης ευγνώμων για την υγιή κριτική του στυλ παρουσίασης και του σχεδιασμού.

(PHP 4, PHP 5, PHP 7)

str_replace- Αντικαθιστά όλες τις εμφανίσεις της συμβολοσειράς αναζήτησης με τη συμβολοσειρά αντικατάστασης

Περιγραφή

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

Εάν δεν χρειάζεστε σύνθετους κανόνες εύρεσης/αντικατάστασης (όπως κανονικές εκφράσεις), αυτή η λειτουργία είναι προτιμότερη. preg_replace().

Λίστα παραμέτρων

Εάν η αναζήτηση και η αντικατάσταση είναι πίνακες, τότε str_replace()χρησιμοποιεί κάθε τιμή από τον αντίστοιχο πίνακα για αναζήτηση και αντικατάσταση στο θέμα. Εάν υπάρχουν λιγότερα στοιχεία στον πίνακα αντικατάστασης από ό,τι στην αναζήτηση, η κενή συμβολοσειρά θα χρησιμοποιηθεί ως συμβολοσειρά αντικατάστασης για τις υπόλοιπες τιμές. Εάν η αναζήτηση είναι ένας πίνακας και η αντικατάσταση είναι μια συμβολοσειρά, τότε αυτή η συμβολοσειρά αντικατάστασης θα χρησιμοποιηθεί για κάθε στοιχείο του πίνακα αναζήτησης. Η αντίστροφη περίπτωση δεν έχει νόημα.

Εάν η αναζήτηση ή η αντικατάσταση είναι πίνακες, τα στοιχεία τους θα υποβληθούν σε επεξεργασία από την πρώτη έως την τελευταία.

Η τιμή που αναζητάτε, γνωστή και ως βελόνα(βελόνα). Μπορείτε να χρησιμοποιήσετε έναν πίνακα για πολλές τιμές αναζήτησης.

Αντικαθιστώ

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

Θέμα

Η συμβολοσειρά ή ο πίνακας προς αναζήτηση και αντικατάσταση, γνωστό και ως άχυρα(μια στοίβα σανό).

Εάν το θέμα είναι ένας πίνακας, τότε η αναζήτηση και η αντικατάσταση θα εκτελεστούν σε κάθε στοιχείο του θέματος και το αποτέλεσμα της συνάρτησης θα είναι επίσης ένας πίνακας.

Εάν περάσει, θα οριστεί στον αριθμό των αντικαταστάσεων που έγιναν.

Αξίες επιστροφής

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

Παραδείγματα

Παράδειγμα #1 Παραδείγματα χρήσης str_replace()

// εκχωρεί
$bodytag = str_replace("%body%" , "μαύρο" , " " );

// εκχώρηση: Hll Wrld f PHP
$vowels = array("a" , "e" , "i" , "o" , "u" , "A" , "E" , "I" , "O" , "U" );
$onlyconsonants = str_replace ($vowels , "" , "Hello World of PHP" );

// αναθέτει: Θα πρέπει να τρώτε πίτσα, μπύρα και παγωτό κάθε μέρα
$φράση = «Θα πρέπει να τρώτε φρούτα, λαχανικά και φυτικές ίνες κάθε μέρα».;
$healthy = array("φρούτα" , "λαχανικά" , "ίνες" );
$yummy = array("πίτσα" , "μπύρα" , "παγωτό" );

$newphrase = str_replace ($healthy , $yummy , $phrase );

// εκχώρηση: 2
$str = str_replace ("ll" , "" , "καλή γκόλλυ δεσποινίς Μόλι!" , $count );
echo $count ;
?>

Παράδειγμα #2 Παραδείγματα πιθανών κόλπα με str_replace()

// Εντολή αντικατάστασης
$str = "Γραμμή 1\nΓραμμή 2\rΓραμμή 3\r\nΓραμμή 4\n";
$order = array("\r\n" , "\n" , "\r" );
$replace = "
" ;

// Χειρίζεται πρώτα τα \r\n για να αποφύγετε την αντικατάστασή τους ξανά.
echo $newstr = str_replace ($order , $replace , $str );

// Έξοδοι F, επειδή Το Α αντικαθίσταται από το Β, μετά το Β από το Γ και ούτω καθεξής...
// Ως αποτέλεσμα, το E θα αντικατασταθεί από το F, καθώς η αντικατάσταση γίνεται από αριστερά προς τα δεξιά.
$search = array("A" , "B" , "C" , "D" , "E" );
$replace = array("B" , "C" , "D" , "E" , "F" );
$subject = "A" ;
echo str_replace ($search , $replace , $subject );

// Έξοδοι: apple, nut, nut (για τον παραπάνω λόγο)
$letters = array("I" , "o" );
$fruit = array("apple" , "nut" );
$text = "Είμαι περίπου" ;
$output = str_replace ($letters , $fruit , $text );
echo $output ;
?>

Σημειώσεις

Σχόλιο: Αυτή η λειτουργία είναι ασφαλής για το χειρισμό δεδομένων σε δυαδική μορφή.

Προειδοποίηση

Σημείωση για την παραγγελία αντικατάστασης

Επειδή str_replace()αντικαθιστά από αριστερά προς τα δεξιά και, στη συνέχεια, όταν χρησιμοποιείτε πολλαπλές αντικαταστάσεις, μπορεί να αντικαταστήσει την τιμή που είχε εισαχθεί προηγουμένως με μια άλλη. Δείτε επίσης παραδείγματα σε αυτή τη σελίδα.

Σχόλιο:

Αυτή η λειτουργία κάνει διάκριση πεζών-κεφαλαίων. Χρήση str_place()για αντικατάσταση χωρίς διάκριση πεζών-κεφαλαίων.

Σχόλιο: Στην PHP 7.0.0 σε πλατφόρμες 64 bit δεν υπάρχει εφικτό όριο μήκους συμβολοσειράς, σε συστήματα 32 bit και προηγούμενες εκδόσεις της PHP, οι συμβολοσειρές δεν μπορούν να είναι μεγαλύτερες από 2 GB (2147483647 byte).

Σύνταξη

Μια συμβολοσειρά μπορεί να οριστεί με τέσσερα διαφορετικοί τρόποι:

  • μεμονωμένα εισαγωγικά
  • διπλά εισαγωγικά
  • σύνταξη nowdoc (από την PHP 5.3.0)

Μονά εισαγωγικά

Ο πιο απλός τρόποςγια να ορίσετε μια συμβολοσειρά είναι να την περικλείσετε σε μονά εισαγωγικά (σύμβολο " ).

Για να χρησιμοποιήσετε ένα μεμονωμένο εισαγωγικό μέσα σε μια συμβολοσειρά, διαφύγετε με μια ανάστροφη κάθετο ( \ ). Εάν πρέπει να γράψετε την ίδια την ανάστροφη κάθετο, αντιγράψτε την ( \\ ). Όλες οι άλλες ανάστροφες κάθετες θα ερμηνεύονται ως κανονικοί χαρακτήρες, πράγμα που σημαίνει ότι εάν προσπαθήσετε να χρησιμοποιήσετε άλλες ακολουθίες διαφυγής, όπως π.χ. \rή \n, θα βγαίνουν ως έχουν αντί για οποιαδήποτε ειδική συμπεριφορά.

ηχώ "αυτή είναι μια απλή συμβολοσειρά";

ηχώ «Επίσης, μπορείτε να εισάγετε σε γραμμές
χαρακτήρας νέας γραμμής όπως αυτός,
αυτό είναι φυσιολογικό"
;

// Έξοδοι: Μια μέρα ο Άρνολντ είπε: "Θα επιστρέψω"
ηχώ «Μια μέρα ο Άρνολντ είπε: «Θα επιστρέψω»»;

ηχώ "Διαγράψατε το C:\\*.*;";

// Έξοδοι: Διαγράψατε το C:\*.*;
echo "Διαγράψατε το C:\*.*?" ;

// Έξοδος: Δεν θα επεκταθεί: \n νέα γραμμή
ηχώ "Αυτό δεν θα επεκταθεί: \n νέα γραμμή";

// Εκτυπώσεις: Οι μεταβλητές $expand δεν επεκτείνονται επίσης κατά $
ηχώ "Οι μεταβλητές $expand επίσης $either δεν επεκτείνονται";
?>

Διπλά εισαγωγικά

Εάν η συμβολοσειρά περικλείεται σε διπλά εισαγωγικά ("), η PHP αναγνωρίζει τις ακόλουθες ειδικές ακολουθίες διαφυγής χαρακτήρων:

Ακολουθίες διαφυγής
Ακολουθία Εννοια
\n νέα γραμμή (LF ή 0x0A (10) σε ASCII)
\r επιστροφή μεταφοράς (CR ή 0x0D (13) σε ASCII)
\ t οριζόντια καρτέλα (HT ή 0x09 (9) σε ASCII)
\v κάθετη καρτέλα (VT ή 0x0B (11) σε ASCII) (από την PHP 5.2.5)
\μι χαρακτήρας διαφυγής (ESC ή 0x1B(27) σε ASCII) (από την PHP 5.4.4)
\φά ροή σελίδων (FF ή 0x0C (12) σε ASCII) (από PHP 5.2.5)
\\ ανάστροφη κάθετο
\$ σύμβολο δολλαρίου
\" διπλό απόσπασμα
\{1,3} ακολουθία χαρακτήρων που ταιριάζουν με μια κανονική έκφραση ενός χαρακτήρα σε οκταδική γλώσσα που ξεχειλίζει σιωπηλά για να χωρέσει σε ένα byte (δηλαδή "\400" === "\000")
\x(1,2) ακολουθία χαρακτήρων που ταιριάζουν με μια τυπική έκφραση χαρακτήρα σε δεκαεξαδικό συμβολισμό
\u(+) ακολουθία χαρακτήρων που ταιριάζουν με μια τυπική έκφραση χαρακτήρων Unicode που αντιστοιχίζεται σε μια συμβολοσειρά σε αναπαράσταση UTF-8 (προστέθηκε στην PHP 7.0.0)

Όπως συμβαίνει με μια συμβολοσειρά που περικλείεται σε μονά εισαγωγικά, η διαφυγή οποιουδήποτε χαρακτήρα θα εκτυπώσει επίσης τον ίδιο τον χαρακτήρα διαφυγής. Πριν από την PHP 5.1.1, η ανάστροφη κάθετο \($var)δεν τυπώνεται.

heredoc

Ο τρίτος τρόπος ορισμού συμβολοσειρών είναι η χρήση της σύνταξης heredoc: <<< . Μετά από αυτήν τη δήλωση, πρέπει να καθορίσετε ένα αναγνωριστικό και, στη συνέχεια, μια νέα γραμμή. Μετά από αυτό έρχεται η ίδια η γραμμή και μετά το ίδιο αναγνωριστικό που κλείνει το ένθετο.

Γραμμή πρέπειξεκινήστε με ένα αναγνωριστικό κλεισίματος, π.χ. θα πρέπει να βρίσκεται στην πρώτη στήλη της σειράς. Επιπλέον, το αναγνωριστικό πρέπει να ακολουθεί τις ίδιες συμβάσεις ονομασίας με όλες τις άλλες ετικέτες PHP: περιέχει μόνο αλφαριθμητικούς χαρακτήρες και κάτω παύλες και δεν πρέπει να ξεκινά με αριθμό (επιτρέπονται οι υπογραμμίσεις).

Προσοχή

Είναι πολύ σημαντικό να σημειωθεί ότι η συμβολοσειρά με το αναγνωριστικό κλεισίματος δεν πρέπει να περιέχει άλλους χαρακτήρες, εκτός από το ερωτηματικό ( ; ). Αυτό σημαίνει ότι η ταυτότητα δεν πρέπει να έχει εσοχήκαι ότι δεν μπορούν να υπάρχουν κενά ή καρτέλες πριν ή μετά το ερωτηματικό. Είναι επίσης σημαντικό να κατανοήσετε ότι ο πρώτος χαρακτήρας πριν από το αναγνωριστικό κλεισίματος πρέπει να είναι χαρακτήρας νέας γραμμής, όπως ορίζεται από το λειτουργικό σας σύστημα. Για παράδειγμα, σε συστήματα UNIX, συμπεριλαμβανομένου του macOS, αυτό είναι \n. Το αναγνωριστικό κλεισίματος πρέπει επίσης να ακολουθείται αμέσως από μια νέα γραμμή.

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

Beispiel #1 Παράδειγμα εσφαλμένης σύνταξης

τάξη foo (
δημόσιο $bar =<<μπαρ
ΕΟΤ;
// Η συμπλήρωση πριν από το αναγνωριστικό κλεισίματος δεν επιτρέπεται
}
?>

Beispiel #2 Σωστό παράδειγμα σύνταξης

τάξη foo (
δημόσιο $bar =<<μπαρ
ΕΟΤ;
}
?>

Το Heredoc δεν μπορεί να χρησιμοποιηθεί για την προετοιμασία πεδίων κλάσης. Από την PHP 5.3, αυτός ο περιορισμός ισχύει μόνο για heredoc που περιέχουν μεταβλητές μέσα τους.

Το κείμενο Heredoc συμπεριφέρεται όπως μια συμβολοσειρά με διπλά εισαγωγικά χωρίς να τα έχει. Αυτό σημαίνει ότι δεν χρειάζεται να ξεφύγετε από εισαγωγικά στο heredoc, αλλά μπορείτε να χρησιμοποιήσετε τις παραπάνω ακολουθίες διαφυγής. Ο χειρισμός των μεταβλητών γίνεται, αλλά πρέπει να είστε τόσο προσεκτικοί όταν χρησιμοποιείτε σύνθετες μεταβλητές μέσα σε ένα heredoc όσο όταν εργάζεστε με συμβολοσειρές.

Παράδειγμα ορισμού συμβολοσειράς Beispiel #3 heredoc

$str =<<Παράδειγμα γραμμής,
που εκτείνεται σε πολλές γραμμές
χρησιμοποιώντας τη σύνταξη heredoc.
EOD;

Class foo
{
var $foo ;
var $bar ;

Συνάρτηση __construct()
{
$this -> foo = "foo" ;
$αυτό ->
}
}

$foo = newfoo();
$name = " Όνομα " ;

ηχώ<<Το όνομά μου είναι " $name ". Πληκτρολογώ $foo -> foo .
Τώρα βγάζω
( $foo -> γραμμή [ 1 ]) .
Αυτό θα πρέπει να δώσει ένα κεφαλαίο "A": \x41
ΕΟΤ;
?>

Το όνομά μου είναι "Όνομα". Πληκτρολογώ Foo. Τώρα, βγάζω το Bar2. Αυτό θα πρέπει να δώσει ένα κεφαλαίο "A": A

Είναι επίσης δυνατό να χρησιμοποιηθεί η σύνταξη heredoc για τη μετάδοση δεδομένων μέσω ορισμάτων συνάρτησης:

Από την έκδοση 5.3.0, κατέστη δυνατή η προετοιμασία στατικών μεταβλητών και ιδιοτήτων/σταθερών κλάσης χρησιμοποιώντας τη σύνταξη heredoc:

Beispiel #5 Χρήση heredoc για την προετοιμασία στατικών μεταβλητών

// Στατικές μεταβλητές
functionfoo()
{
στατικό $bar =<<Δεν υπάρχει τίποτα εδώ...
επιγραφή;
}

// Σταθερές/ιδιότητες κλάσης
τάξη foo
{
const BAR =<<Ένα παράδειγμα χρήσης σταθεράς
FOOBAR;

Δημόσια $βάση =<<Παράδειγμα χρήσης πεδίου
FOOBAR;
}
?>

Από την PHP 5.3.0, είναι επίσης δυνατό να περικλείεται το αναγνωριστικό Heredoc με διπλά εισαγωγικά:

Nowdoc

Το Nowdoc είναι το ίδιο για τις συμβολοσειρές με ένα εισαγωγικό όπως το heredoc για τις συμβολοσειρές με διπλά εισαγωγικά. Το Nowdoc είναι παρόμοιο με το heredoc, αλλά μέσα του δεν γίνονται αντικαταστάσεις. Αυτή η κατασκευή είναι ιδανική για την ενσωμάτωση κώδικα PHP ή άλλων μεγάλων μπλοκ κειμένου χωρίς να χρειάζεται να διαφύγετε. Σε αυτό είναι λίγο παρόμοιο με την κατασκευή SGML. δηλώνοντας ένα μπλοκ κειμένου που δεν προορίζεται να υποβληθεί σε επεξεργασία.

Το Nowdoc υποδεικνύεται με την ίδια σειρά <<< , το οποίο χρησιμοποιείται στο heredoc, αλλά το αναγνωριστικό που το ακολουθεί περικλείεται σε μονά εισαγωγικά, για παράδειγμα, <<<"EOT" . Όλες οι προϋποθέσεις που ισχύουν για τα αναγνωριστικά heredoc ισχύουν και για το nowdoc, ειδικά αυτές που ισχύουν για το αναγνωριστικό κλεισίματος.

Παράδειγμα Beispiel #7 nowdoc

ηχώ<<<"EOD"
παράδειγμα κειμένου,
που εκτείνεται σε πολλές γραμμές
χρησιμοποιώντας τη σύνταξη nowdoc. Οι ανάστροφες κάθετες αντιμετωπίζονται πάντα κυριολεκτικά,
για παράδειγμα, \\ και \".
EOD;

Το αποτέλεσμα της εκτέλεσης αυτού του παραδείγματος:

Ένα παράδειγμα κειμένου που εκτείνεται σε πολλές γραμμές χρησιμοποιώντας τη σύνταξη nowdoc. Οι ανάστροφες κάθετες αντιμετωπίζονται πάντα κυριολεκτικά, όπως \\ και \".

Παράδειγμα #8 Παράδειγμα παράθεσης συμβολοσειράς Nowdoc με μεταβλητές

/* Πιο πολύπλοκο παράδειγμα με μεταβλητές. */
τάξη foo
{
δημόσιο $foo ;
δημόσια γραμμή $ ;

Συνάρτηση __construct()
{
$this -> foo = "foo" ;
$this -> bar = array("Bar1" , "Bar2" , "Bar3" );
}
}

$foo = newfoo();
$name = " Όνομα " ;

ηχώ<<<"EOT"
Το όνομά μου είναι "$name". Πληκτρολογώ $foo->foo.
Τώρα πληκτρολογώ ($foo->bar).
Αυτό δεν πρέπει να δίνει κεφαλαίο "A": \x41
ΕΟΤ;
?>

Το αποτέλεσμα της εκτέλεσης αυτού του παραδείγματος:

Το όνομά μου είναι "$name". Πληκτρολογώ $foo->foo. Τώρα πληκτρολογώ ($foo->bar). Αυτό δεν πρέπει να δίνει κεφαλαίο "A": \x41

Παράδειγμα #9 Παράδειγμα στατικών δεδομένων

τάξη foo (
δημόσιο $bar =<<<"EOT"
μπαρ
ΕΟΤ;
}
?>

Σχόλιο:

Η υποστήριξη nowdoc προστέθηκε στην PHP 5.3.0.

Επεξεργασία μεταβλητών

Εάν μια συμβολοσειρά καθορίζεται σε διπλά εισαγωγικά ή με heredoc, οι μεταβλητές μέσα σε αυτήν υποβάλλονται σε επεξεργασία.

Υπάρχουν δύο τύποι σύνταξης: απλή και σύνθετη. Η απλή σύνταξη είναι ευκολότερη και πιο βολική. Καθιστά δυνατή την επεξεργασία μιας μεταβλητής, μιας τιμής πίνακα ( πίνακας) ή ιδιότητες αντικειμένου ( αντικείμενο) με ελάχιστη προσπάθεια.

Η σύνθετη σύνταξη μπορεί να αναγνωριστεί από τα σγουρά άγκιστρα που περιβάλλουν την έκφραση.

Απλή Σύνταξη

Εάν ο διερμηνέας συναντήσει ένα σύμβολο του δολαρίου ( $ ), συλλαμβάνει όσο το δυνατόν περισσότερους χαρακτήρες για να σχηματίσει το σωστό όνομα μεταβλητής. Εάν θέλετε να καθορίσετε το τέλος ενός ονόματος, περικλείστε το όνομα της μεταβλητής σε σγουρά άγκιστρα.

$juice = "μήλο" ;

echo "Ήπιε λίγο χυμό $χυμού." . PHP_EOL ;

// Λάθος. Το "s" είναι ένας έγκυρος χαρακτήρας για ένα όνομα μεταβλητής, αλλά το όνομα της μεταβλητής είναι $juice.
echo "Ήπιε λίγο χυμό από $χυμούς ." ;

// Σωστός. Το τέλος του ονόματος της μεταβλητής προσδιορίζεται αυστηρά χρησιμοποιώντας αγκύλες:
echo "Ήπιε λίγο χυμό από $( juice ) s." ;
?>

Το αποτέλεσμα της εκτέλεσης αυτού του παραδείγματος:

Ήπιε λίγο χυμό μήλου. Ήπιε λίγο χυμό από. Ήπιε λίγο χυμό από μήλα.

Ένα στοιχείο ενός πίνακα ( πίνακας) ή ιδιότητα αντικειμένου ( αντικείμενο). Στους δείκτες πίνακα, η αγκύλη κλεισίματος ( ] ) σηματοδοτεί το τέλος του ορισμού του ευρετηρίου. Οι ίδιοι κανόνες ισχύουν για τις ιδιότητες των αντικειμένων με τις απλές μεταβλητές.

Παράδειγμα #10 Παράδειγμα απλής σύνταξης

define("KOOLAID" , "koolaid1" );
$juices = array("μήλο" , "πορτοκαλί" , "koolaid1" => "μοβ" );

echo "Ήπιε λίγο $juices [ 0 ] juice." . PHP_EOL ;
echo "Ήπιε χυμούς $χυμούς [ 1 ]." . PHP_EOL ;
echo "Ήπιε λίγο $juices [ koolaid1 ] juice." . PHP_EOL ;

άτομα της τάξης (
public $john = "Τζον Σμιθ" ;
public $jane = "Jane Smith" ;
public $robert = " Robert Paulsen " ;

Public $smith = "Smith" ;
}

$people = νέα άτομα();

echo " $people -> ο Γιάννης ήπιε λίγο χυμό $juices [ 0 ]." . PHP_EOL ;
echo " $people -> ο john είπε γεια στον $people -> jane ." . PHP_EOL ;
echo " $people -> η σύζυγος του John "χαιρέτησε τον $people -> Robert." . PHP_EOL ;
echo " $people -> robert χαιρέτησε τους δύο $people -> smiths ." ; // Δεν θα λειτουργήσει
?>

Το αποτέλεσμα της εκτέλεσης αυτού του παραδείγματος:

Ήπιε λίγο χυμό μήλου. Ήπιε λίγο χυμό πορτοκαλιού. Ήπιε λίγο μοβ χυμό. Ο Τζον Σμιθ ήπιε λίγο χυμό μήλου. Ο Τζον Σμιθ είπε τότε ένα γεια στην Τζέιν Σμιθ. Η σύζυγος του Τζον Σμιθ χαιρέτησε τον Ρόμπερτ Πόλσεν.

Η PHP 7.1.0 πρόσθεσε υποστήριξη αρνητικόςαριθμητικοί δείκτες.

Παράδειγμα #11 Αρνητικοί αριθμητικοί δείκτες

$string = "string" ;
ηχώ «Ο χαρακτήρας στον δείκτη -2 είναι$string [- 2 ] ." , PHP_EOL ;
$string [- 3 ] = "o" ;
ηχώ "Αλλάζοντας τον χαρακτήρα στη θέση -3 σε "o" παράγει την ακόλουθη γραμμή:$string ." , PHP_EOL ;
?>

Το αποτέλεσμα της εκτέλεσης αυτού του παραδείγματος:

Ο χαρακτήρας με δείκτη -2 είναι n. Η αλλαγή του χαρακτήρα στη θέση -3 σε "o" παράγει την ακόλουθη συμβολοσειρά: ισχυρή

Για οτιδήποτε πιο περίπλοκο, χρησιμοποιήστε σύνθετη σύνταξη.

Πολύπλοκη (σγουρή) σύνταξη

Ονομάζεται σύνθετη όχι επειδή είναι δυσνόητη, αλλά επειδή επιτρέπει τη χρήση σύνθετων εκφράσεων.

Οποιαδήποτε βαθμωτή μεταβλητή, στοιχείο πίνακα ή ιδιότητα αντικειμένου που αντιστοιχίζεται σε μια συμβολοσειρά μπορεί να αναπαρασταθεί σε μια συμβολοσειρά με αυτήν τη σύνταξη. Απλώς γράψτε την έκφραση ακριβώς όπως θα κάνατε έξω από τη συμβολοσειρά και στη συνέχεια περικλείστε την μέσα { και } . Επειδή η { δεν είναι δυνατή η διαφυγή, αυτή η σύνταξη θα αναγνωριστεί μόνο όταν $ ακολουθεί αμέσως μετά { . Χρήση {\$ για εκτύπωση {$ . Μερικά ενδεικτικά παραδείγματα:

// Εμφάνιση όλων των σφαλμάτων
error_reporting(E_ALL);

$great = " υπέροχο " ;

// Δεν λειτουργεί, βγάζει: Αυτό (υπέροχο)
echo "This is ( $great )" ;

// Works, outputs: Αυτό είναι υπέροχο
echo "This is ($great)" ;

// Εργα
ηχώ «Αυτή η πλατεία είναι φαρδιά( $τετράγωνο -> πλάτος ) 00 εκατοστά." ;

// Works, τα πλήκτρα με εισαγωγικά λειτουργούν μόνο με σύνταξη σγουρής αγκύλης
echo "Αυτό λειτουργεί: ( $arr [ "key" ]) " ;

// Εργα
echo "Αυτό λειτουργεί: ( $arr [ 4 ][ 3 ]) " ;

// Αυτό είναι λάθος για τον ίδιο λόγο που το $foo είναι έξω
// γραμμές. Με άλλα λόγια, θα εξακολουθεί να λειτουργεί
// αλλά εφόσον η PHP αναζητά πρώτα τη σταθερά foo, αυτό θα καλέσει
// Σφάλμα επιπέδου E_NOTICE (απροσδιόριστη σταθερά).
ηχώ "Δεν είναι σωστό:( $arr [ foo ][ 3 ]) " ;

// Εργα. Όταν χρησιμοποιείτε πολυδιάστατους πίνακες στο εσωτερικό
// Οι χορδές χρησιμοποιούν πάντα σγουρά τιράντες
echo "Αυτό λειτουργεί: ( $arr [ "foo" ][ 3 ]) " ;

// Εργα.
echo "Αυτό λειτουργεί: " . $arr [ "foo" ][ 3 ];

ηχώ «Λειτουργεί επίσης:( $obj -> τιμές [ 3 ]-> όνομα ) " ;

ηχώ "Αυτή είναι η τιμή της μεταβλητής που ονομάζεται$name : ($( $name )) " ;

ηχώ "Αυτή είναι η τιμή της μεταβλητής κατά όνομα, η οποία επιστρέφεται από τη συνάρτηση getName():($( getName ())) ";

ηχώ "Αυτή είναι η τιμή της μεταβλητής κατά όνομα που επιστρέφεται από το \$object->getName():($( $object -> getName ())) " ;

// Δεν λειτουργεί, βγάζει: Αυτό επιστρέφει η getName(): (getName())
ηχώ "Αυτό επιστρέφει η getName(): (getName())";
?>

Είναι επίσης δυνατή η πρόσβαση στις ιδιότητες αντικειμένων μέσα σε συμβολοσειρές χρησιμοποιώντας αυτήν τη σύνταξη.

τάξη foo (
var $bar = "Είμαι μπαρ." ;
}

$foo = newfoo();
$bar = "bar" ;
$baz = array("foo" , "bar" , "baz" , "quux" );
echo " ( $foo -> $bar ) \n" ;
echo " ( $foo ->( $baz [ 1 ])) \n" ;
?>

Το αποτέλεσμα της εκτέλεσης αυτού του παραδείγματος:

Είμαι μπαρ. Είμαι μπαρ.

Σχόλιο:

Οι συναρτήσεις, οι κλήσεις μεθόδων, οι στατικές μεταβλητές κλάσης και οι σταθερές κλάσεων λειτουργούν εσωτερικά {$} , από την έκδοση 5 της PHP. Ωστόσο, η καθορισμένη τιμή θα αντιμετωπίζεται ως όνομα μεταβλητής στο ίδιο πλαίσιο με τη συμβολοσειρά στην οποία ορίζεται. Χρήση μονών σγουρά τιράντες ( {} ) δεν θα λειτουργήσει για την πρόσβαση στις τιμές των συναρτήσεων, των μεθόδων, των σταθερών κλάσης ή των στατικών μεταβλητών κλάσης.

// Εμφάνιση όλων των σφαλμάτων
error_reporting(E_ALL);

μπύρες κατηγορίας (
const softdrink = "rootbeer" ;
public static $ale = "ipa" ;
}

$rootbeer = "A & W" ;
$ipa = " Alexander Keith\"s " ;

// Αυτό λειτουργεί, βγάζει: Θα ήθελα A & W
echo "I'd like ($( beers :: softdrink )) \n" ;

// Αυτό λειτουργεί επίσης, βγάζει: Θα ήθελα του Alexander Keith
echo "I'd like ($( beers :: $ale )) \n" ;
?>

Πρόσβαση σε έναν χαρακτήρα σε μια συμβολοσειρά και αλλαγή του

Οι χαρακτήρες σε συμβολοσειρές μπορούν να χρησιμοποιηθούν και να τροποποιηθούν καθορίζοντας τη μετατόπισή τους από την αρχή της συμβολοσειράς, ξεκινώντας από το μηδέν, σε αγκύλες μετά τη συμβολοσειρά, για παράδειγμα, $str . Σκεφτείτε μια συμβολοσειρά για αυτόν τον σκοπό ως μια σειρά χαρακτήρων. Εάν πρέπει να λάβετε ή να αντικαταστήσετε περισσότερους από 1 χαρακτήρες, μπορείτε να χρησιμοποιήσετε τις λειτουργίες substr()και substr_replace().

Σχόλιο: από την PHP 7.1.0, υποστηρίζονται αρνητικές τιμές μετατόπισης. Ορίζουν το offset από το τέλος της χορδής. Προηγουμένως, οι αρνητικές μετατοπίσεις προκαλούσαν σφάλμα επιπέδου E_ΣΗΜΕΙΩΣΗκατά την ανάγνωση (επιστρέφοντας μια κενή συμβολοσειρά) ή E_ΠΡΟΕΙΔΟΠΟΙΗΣΗ on write (αφήνοντας τη συμβολοσειρά αμετάβλητη).

Σχόλιο: Ένας χαρακτήρας σε μια συμβολοσειρά μπορεί επίσης να προσπελαστεί χρησιμοποιώντας σγουρά άγκιστρα, όπως $str(42) .

Προσοχή

Η προσπάθεια εγγραφής σε μια μετατόπιση εκτός της συμβολοσειράς θα συμπληρώσει τη συμβολοσειρά με κενά μέχρι αυτή τη μετατόπιση. Οι μη ακέραιοι τύποι θα μετατραπούν σε ακέραιους. Λανθασμένος τύπος μετατόπισης θα προκαλέσει σφάλμα επιπέδου E_ΠΡΟΕΙΔΟΠΟΙΗΣΗ. Χρησιμοποιείται μόνο ο πρώτος χαρακτήρας της αντιστοιχισμένης συμβολοσειράς. Από την PHP 7.1.0, η εκχώρηση κενού συμβολοσειράς θα προκαλέσει μοιραίο σφάλμα. Προηγουμένως, σε αυτήν την περίπτωση, εκχωρήθηκε ένα null byte (NULL).

Προσοχή

Οι συμβολοσειρές στην PHP είναι εσωτερικά πίνακες byte. Ως αποτέλεσμα, η πρόσβαση ή η τροποποίηση μιας συμβολοσειράς με μετατόπιση δεν είναι ασφαλής για πολλά byte και θα πρέπει να γίνεται μόνο με συμβολοσειρές σε κωδικοποιήσεις ενός byte όπως το ISO-8859-1.

Σχόλιο: Από την PHP 7.1.0, η χρήση ενός κενού ευρετηρίου προκαλεί ένα μοιραίο σφάλμα, προηγουμένως σε μια τέτοια περίπτωση η συμβολοσειρά μετατράπηκε σε πίνακα χωρίς προειδοποίηση.

Παράδειγμα #12 Αρκετά παραδείγματα συμβολοσειρών

// Λάβετε τον πρώτο χαρακτήρα της συμβολοσειράς
$str = "Αυτό είναι μια δοκιμή." ;
$first = $str [ 0 ];

// Λάβετε τον τρίτο χαρακτήρα της συμβολοσειράς
$τρίτο = $str [ 2 ];

// Λάβετε τον τελευταίο χαρακτήρα της συμβολοσειράς
$str = "Αυτό είναι ακόμα μια δοκιμή." ;
$last = $str [strlen($str)- 1];

// Αλλάξτε τον τελευταίο χαρακτήρα της συμβολοσειράς
$str = " Κοιτάξτε τη θάλασσα " ;
$str [ strlen ($str )- 1 ] = "e" ;

?>

Από την PHP 5.4, η μετατόπιση σε μια συμβολοσειρά πρέπει να είναι είτε ακέραιος είτε συμβολοσειρά που περιέχει αριθμούς, διαφορετικά θα εκδοθεί μια προειδοποίηση. Προηγουμένως, μια μετατόπιση που δόθηκε από μια συμβολοσειρά όπως "foo", χωρίς προειδοποίηση μετατράπηκε σε 0 .

Παράδειγμα #13 Διαφορές μεταξύ PHP 5.3 και PHP 5.4

$str = "abc" ;

Var_dump($str["1"]);
var_dump (isset($str [ "1" ]));

Var_dump($str[ "1.0" ]);
var_dump (isset($str [ "1.0" ]));

Var_dump($str["x"]);
var_dump (isset($str [ "x" ]));

Var_dump($str[ "1x" ]);
var_dump (isset($str [ "1x" ]));
?>

Το αποτέλεσμα της εκτέλεσης αυτού του παραδείγματος στην PHP 5.3 είναι:

string(1) "b" bool(true) string(1) "b" bool(true) string(1) "a" bool(true) string(1) "b" bool(true)

Το αποτέλεσμα της εκτέλεσης αυτού του παραδείγματος στην PHP 5.4 είναι:

string(1) "b" bool(true) Προειδοποίηση: Παράνομη μετατόπιση συμβολοσειράς "1.0" σε /tmp/t.php στη γραμμή 7 string(1) "b" bool(false) Προειδοποίηση: Παράνομη μετατόπιση συμβολοσειράς "x" σε / tmp/t.php στη γραμμή 9 συμβολοσειρά (1) "a" bool(false) string(1) "b" bool(false)

Σχόλιο:

Προσπάθεια πρόσβασης σε μεταβλητές άλλων τύπων (εκτός από πίνακες ή αντικείμενα που υλοποιούν ορισμένες διεπαφές) με ή {} επιστροφή σιωπηλά ΜΗΔΕΝΙΚΟ.

Σχόλιο:

Η PHP 5.5 πρόσθεσε υποστήριξη για την πρόσβαση σε χαρακτήρες σε γράμματα συμβολοσειρών χρησιμοποιώντας τη σύνταξη ή {} .

Υπάρχουν πολλές χρήσιμες συναρτήσεις για την τροποποίηση συμβολοσειρών.

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

Μετατροπή σε συμβολοσειρά

Η τιμή μπορεί να μετατραπεί σε συμβολοσειρά χρησιμοποιώντας ένα cast (σειρά), ή λειτουργίες strval(). Σε εκφράσεις όπου απαιτείται συμβολοσειρά, η μετατροπή πραγματοποιείται αυτόματα. Αυτό συμβαίνει όταν χρησιμοποιείτε λειτουργίες ηχώή Τυπώνω, ή όταν η τιμή μιας μεταβλητής συγκρίνεται με μια συμβολοσειρά. Διαβάζοντας τις ενότητες Τύποι και Χειρισμός τύπων του εγχειριδίου θα γίνουν πιο ξεκάθαρα τα ακόλουθα. δείτε επίσης settype().

Οι πίνακες μετατρέπονται πάντα σε συμβολοσειρά "πίνακας", έτσι δεν μπορείτε να εμφανίσετε τα περιεχόμενα του πίνακα ( πίνακας) χρησιμοποιώντας ηχώή Τυπώνωγια να δούμε τι περιέχει. Για να προβάλετε ένα μεμονωμένο στοιχείο, χρησιμοποιήστε κάτι σαν echo $arr["foo"]. Δείτε παρακάτω για συμβουλές σχετικά με τον τρόπο εμφάνισης/προβολής όλου του περιεχομένου.

Για να μετατρέψετε μια μεταβλητή τύπου "Αντικείμενο"ανά τύπο σειράχρησιμοποιείται η μαγική μέθοδος __toString.

Εννοια ΜΗΔΕΝΙΚΟμετατρέπεται πάντα στην κενή συμβολοσειρά.

Όπως μπορείτε να δείτε παραπάνω, η άμεση συμβολοσειρά πινάκων, αντικειμένων ή πόρων δεν παρέχει καμία χρήσιμη πληροφορία για τις ίδιες τις τιμές, εκτός από τους τύπους τους. Ένας πιο κατάλληλος τρόπος για την έξοδο τιμών για τον εντοπισμό σφαλμάτων είναι η χρήση συναρτήσεων print_r()και var_dump().

Οι περισσότερες τιμές στην PHP μπορούν να μετατραπούν σε συμβολοσειρά για μόνιμη αποθήκευση. Αυτή η μέθοδος ονομάζεται σειριοποίηση και μπορεί να γίνει με τη συνάρτηση serialize().

Μετατροπή συμβολοσειρών σε αριθμούς

Εάν η συμβολοσειρά αναγνωρίζεται ως αριθμητική τιμή, η τιμή και ο τύπος που προκύπτει καθορίζονται ως εξής.

Εάν η συμβολοσειρά δεν περιέχει κανέναν από τους χαρακτήρες ".", "e" ή "E", και η τιμή του αριθμού ταιριάζει στο εύρος των ακεραίων αριθμών (καθορίζεται PHP_INT_MAX), η συμβολοσειρά θα αναγνωριστεί ως ακέραιος αριθμός ( ακέραιος αριθμός). Σε όλες τις άλλες περιπτώσεις, θεωρείται αριθμός κινητής υποδιαστολής ( φλοτέρ).

Η τιμή καθορίζεται από το αρχικό μέρος της συμβολοσειράς. Εάν η συμβολοσειρά ξεκινά με μια έγκυρη αριθμητική τιμή, αυτή η τιμή θα χρησιμοποιηθεί. Διαφορετικά, η τιμή θα είναι 0 (μηδέν). Μια έγκυρη αριθμητική τιμή είναι ένα ή περισσότερα ψηφία (τα οποία μπορεί να περιέχουν μια υποδιαστολή), προαιρετικά πριν από ένα πρόσημο, ακολουθούμενο από έναν προαιρετικό εκθέτη. Ο εκθέτης είναι "e" ή "E" ακολουθούμενο από ένα ή περισσότερα ψηφία.

$foo = 1 + "10,5" ; // Το $foo είναι float (11,5)
$foo = 1 + "-1.3e3" ; // Το $foo είναι float (-1299)
$foo = 1 + "bob-1.3e3" ; // Το $foo είναι ακέραιος αριθμός (1)
$foo = 1 + "bob3" ; // Το $foo είναι ακέραιος αριθμός (1)
$foo = 1 + "10 μικρά γουρούνια" ; // Το $foo είναι ακέραιος αριθμός (11)
$foo = 4 + "10.2 Μικρά Γουρουνάκια" ; // Το $foo είναι float (14.2)
$foo = "10,0 γουρούνια" + 1 ; // Το $foo είναι float (11)
$foo = "10,0 γουρούνια" + 1,0 ; // Το $foo είναι float (11)
?>

Δείτε την ενότητα strtod(3) της τεκμηρίωσης του Unix για περισσότερες πληροφορίες σχετικά με αυτήν τη μετατροπή.

Εάν θέλετε να δοκιμάσετε οποιοδήποτε από τα παραδείγματα αυτής της ενότητας, αντιγράψτε και επικολλήστε το και την ακόλουθη γραμμή για να δείτε τι συμβαίνει:

echo "\$foo== $foo ; type: " . gettype ($foo ) . "
\n" ;
?>

Μην περιμένετε να λάβετε τον κωδικό χαρακτήρα μετατρέποντάς τον σε ακέραιο (όπως γίνεται, για παράδειγμα, στο C). Για να μετατρέψετε χαρακτήρες στους κωδικούς τους ASCII και αντίστροφα, χρησιμοποιήστε τις συναρτήσεις ord()και chr().

Στοιχεία υλοποίησης τύπου συμβολοσειράς

7 χρόνια πριν

Η τεκμηρίωση δεν αναφέρει, αλλά ένα ερωτηματικό κλεισίματος στο τέλος του heredoc ερμηνεύεται στην πραγματικότητα ως πραγματικό ερωτηματικό, και ως εκ τούτου, μερικές φορές οδηγεί σε συντακτικά λάθη.

$foo =<<Α Β Γ Δ
ΤΕΛΟΣ;
?>

Αυτό δεν:

φου (<<Α Β Γ Δ
ΤΕΛΟΣ;
);
// συντακτικό σφάλμα, απροσδόκητο ";"
?>

Χωρίς ερωτηματικό, λειτουργεί καλά:

φου (<<Α Β Γ Δ
ΤΕΛΟΣ
);
?>

Πριν από 3 χρόνια

Μπορείτε να χρησιμοποιήσετε συμβολοσειρά σαν πίνακα χαρακτήρων (όπως το C)

$a = "Δοκιμή πίνακα συμβολοσειρών";

var_dump($a);
// Return string(17) "String array test"

var_dump($a);
// Επιστροφή συμβολοσειράς(1) "S"

// -- Με cast array --
var_dump((πίνακας)$a);
// Return array(1) ( => string(17) "String array test")

var_dump((πίνακας)$a);
// Επιστροφή συμβολοσειράς(17) "S"

Norihiori

15 χρόνια πριν

Μπορείτε να χρησιμοποιήσετε τη σύνθετη σύνταξη για να βάλετε την τιμή και των δύο ιδιοτήτων αντικειμένου ΚΑΙ μεθόδων αντικειμένου μέσα σε μια συμβολοσειρά. Για παράδειγμα...
Δοκιμή τάξης (
δημόσιο $one = 1 ;
δημόσια συνάρτηση δύο()(
επιστροφή 2 ;
}
}
$test = new Test();
echo "foo ( $test -> one ) bar ( $test -> two ()) " ;
?>
Θα βγει "foo 1 bar 2".

Ωστόσο, δεν μπορείτε να το κάνετε αυτό για όλες τις τιμές στον χώρο ονομάτων σας. Οι σταθερές κλάσης και οι στατικές ιδιότητες/μέθοδοι δεν θα λειτουργήσουν επειδή η σύνθετη σύνταξη αναζητά το "$".
Δοκιμή τάξης (
const ONE = 1 ;
}
echo "foo (Test::ONE) bar" ;
?>
Αυτό θα δώσει την έξοδο "foo (Test::one) bar". Οι σταθερές και οι στατικές ιδιότητες απαιτούν να χωρίσετε τη συμβολοσειρά.

Πριν από 3 χρόνια

Προσέξτε ότι σύμφωνα με τη "Μετατροπή συμβολοσειράς σε αριθμούς":

Αν ("123abc" == 123 ) ηχώ "(intstr == int) εσφαλμένα ελέγχει ως αληθές.";

// Επειδή η μία πλευρά είναι αριθμός, η συμβολοσειρά μετατρέπεται λανθασμένα από intstr σε int, το οποίο στη συνέχεια ταιριάζει με τον αριθμό δοκιμής.

// True για όλες τις προϋποθέσεις, όπως οι εντολές if και switch (πιθανώς και ενώ βρόχους)!

// Αυτό θα μπορούσε να είναι τεράστιος κίνδυνος ασφάλειας κατά τη δοκιμή/χρήση/αποθήκευση εισόδου χρήστη, ενώ αναμένεται και δοκιμάζεται μόνο για έναν ακέραιο αριθμό.

// Φαίνεται ότι η μόνη επιδιόρθωση είναι το 123 να είναι μια συμβολοσειρά ως "123", οπότε δεν γίνεται καμία μετατροπή.

?>

6 χρόνια πριν

Τα προηγούμενα μηδενικά στις χορδές (η λιγότερο έκπληξη) δεν αντιμετωπίζονται ως οκταδικά.
Σκεφτείτε:
$x = "0123" + 0;
$y = 0123 + 0;
echo "x είναι $x, y είναι $y"; //εκτυπώνει το "x είναι 123, το y είναι 83"
με άλλα λόγια:
* Τα αρχικά μηδενικά σε αριθμητικά κυριολεκτικά στον πηγαίο κώδικα ερμηνεύονται ως "οκταδικά", κ.φ. strtol().
* Τα αρχικά μηδενικά σε συμβολοσειρές (π.χ. δεδομένα που υποβάλλονται από τον χρήστη), όταν μεταφέρονται (σιωπηρά ή ρητά) σε ακέραιο αγνοούνται και θεωρούνται δεκαδικά, c.f. strtod().

10 ΧΡΟΝΙΑ πριν

Ακολουθεί ένα εύκολο hack που επιτρέπει σε συμβολοσειρές με διπλά εισαγωγικά και heredocs να περιέχουν αυθαίρετες εκφράσεις στη σύνταξη σγουρά άγκιστρα, συμπεριλαμβανομένων σταθερών και άλλων κλήσεων συναρτήσεων:

// Δήλωση hack
function_expr ($v ) (επιστροφή $v ;)
$_expr = "_expr" ;

// Η παιδική μας χαρά
define("qwe" , "asd");
καθορίζω("zxc", 5 );

$a= 3 ;
= 4 ;

λειτουργία ντο($a, ) (ΕΠΙΣΤΡΟΦΗ$a+ ; }

// Χρήση
ηχώ"προ{ $_expr(1 + 2 )} ανάρτηση\n"; // βγάζει "pre 3 post"
ηχώ"προ{ $_expr(qwe)} ανάρτηση\n"; // βγάζει "pre asd post"
ηχώ"προ{ $_expr(ντο($a, )+ zxc* 2 )} ανάρτηση\n"; // βγάζει "pre 17 post"

// Η γενική σύνταξη είναι ($_expr(...))
?>

Πριν 2 χρόνια

Νομίζω ότι θα ήταν χρήσιμο να προσθέσω αυτό το σχόλιο έτσι ώστε οι πληροφορίες να εμφανίζονται τουλάχιστον στη σωστή σελίδα στον ιστότοπο της PHP.

Σημειώστε ότι εάν σκοπεύετε να χρησιμοποιήσετε μια συμβολοσειρά με διπλά εισαγωγικά με συσχετιστικό κλειδί, ενδέχεται να εμφανιστεί το σφάλμα T_ENCAPSED_AND_WHITESPACE. Ορισμένοι το θεωρούν ως ένα από τα λιγότερο προφανή μηνύματα σφάλματος.

Μια έκφραση όπως:

$φρούτα=πίνακας(
"ένα"=> "μήλο",
"σι"=> μπανάνα,
//και τα λοιπά
);

Τυπώνω "Αυτό είναι ένα$φρούτα[ "ένα"]"; // T_ENCAPSED_AND_WHITESPACE
?>

σίγουρα θα πέσει σε κομμάτια.

Μπορείτε να το επιλύσετε ως εξής:

Τυπώνω"Αυτό είναι ένα$φρούτα[ ένα] " ; // unquote του κλειδιού
Τυπώνω"Αυτό είναι ένα${ φρούτα[ "ένα"]} " ; // Σύνθετη σύνταξη
Τυπώνω"Αυτό είναι ένα{ $φρούτα[ "ένα"]} " ; // Παραλλαγή σύνθετης σύνταξης
?>

Έχω μια προσωπική προτίμηση για την τελευταία παραλλαγή καθώς είναι πιο φυσική και πιο κοντά στο πώς θα ήταν η έκφραση έξω από τη χορδή.

Δεν είναι ξεκάθαρο (τουλάχιστον για μένα) γιατί η PHP ερμηνεύει λάθος το μεμονωμένο εισαγωγικό μέσα στην έκφραση, αλλά φαντάζομαι ότι έχει να κάνει με το γεγονός ότι τα εισαγωγικά δεν αποτελούν μέρος της συμβολοσειράς τιμών - όταν η συμβολοσειρά αναλύεται ήδη τα εισαγωγικά εμποδίζω … ?

Πριν 2 χρόνια

Και τα δύο πρέπει να λειτουργούν :(

τάξηδοκιμές{
δημόσια στατική
$VAR= "στατικός";
public const VAR =
"const";

δημόσια λειτουργία πωHelloStatic() {
ηχώ
Χαίρετε:{ $αυτό:: $VAR} " ;
}

δημόσια λειτουργία πωHelloConst() {
ηχώ
Χαίρετε:{ $αυτό::VAR)" ; //Σφάλμα ανάλυσης: συντακτικό σφάλμα, απροσδόκητο ")", αναμένοντας "["
}
}

$obj=νέοδοκιμές();
$obj-> πωHelloStatic();
$obj-> πωHelloConst();

Πριν από 3 χρόνια

Κάτι που έζησα και που αναμφίβολα θα βοηθήσει κάποιον. . .
Στον επεξεργαστή μου, αυτό θα επισημάνει τη σύνταξη HTML και το $comment:

$html =<<<"EOD"
$comment
EOD;

Χρησιμοποιώντας αυτό, εμφανίζονται όλα τα ίδια χρώματα:

$html =<<$comment
EOD;

καθιστώντας πολύ πιο εύκολη τη συνεργασία

πριν 11 χρόνια

Για να σώσετε το μυαλό σας, μην διαβάζετε προηγούμενα σχόλια σχετικά με τις ημερομηνίες ;)

Όταν και οι δύο συμβολοσειρές μπορούν να μετατραπούν στους αριθμητικούς (στη δοκιμή ("$a" > "$b")), τότε χρησιμοποιούνται αριθμητικά στοιχεία που προκύπτουν, διαφορετικά οι ΠΛΗΡΕΣ συμβολοσειρές συγκρίνονται ανά γράμμα:

var_dump("1.22" > "01.23" ); // bool(false)
var_dump("1.22.00" > "01.23.00" ); // bool(true)
var_dump("1-22-00" > "01-23-00" ); // bool(true)
var_dump((φλοτέρ)"1.22.00" > (επιπλέει)"01.23.00" ); // bool(false)
?>



Πίνακες:

C_id | εταιρεία | τοποθεσία
1 | Αναζήτηση OOO | Γήπεδο Kudykino 15/3
2 | CJSC Elita | Slunysvalinsk 133/7
3 | OJSC Pyshpyshch | Soldatodachestroyskoe 404

Τύπος επισκευής (τύποι_επισκευής)
r_id | επισκευή_τύποι |
1 | Σφυρί + καρφιά
2 | Καθοδήγηση ομορφιάς
3 | Εξετάζω και διορθώνω επιμελώς

Λίστα παραγγελιών (λίστα)
l_id | Ποιος | Τι ανάγκη | ώρα | σχόλιο χειριστή
1 | 1 | 2 | %timestamp% | %operator_text%
2 | 2 | 1 | | %κείμενο%
3 | 3 | 2 | | %κείμενο%

Ο Πίνακας #1 περιέχει μια λίστα πελατών.
Ο Πίνακας #2 περιέχει μια λίστα υπηρεσιών.
Ο Πίνακας Νο. 3 περιέχει μια λίστα με τις τρέχουσες παραγγελίες για τις επιχειρησιακές ομάδες. Αυτός ο πίνακας ενημερώνεται τακτικά και χρησιμοποιείται μια φόρμα ιστού για τη συμπλήρωσή του. Δεδομένου ότι έρχονται πολλές παραγγελίες, οι εγγραφές εισάγονται στον πίνακα με τη μορφή αναγνωριστικού πελάτη και υπηρεσίας.

Στην πραγματικότητα, το πρόβλημα είναι ότι ο τρίτος πίνακας θα πρέπει να εμφανίζεται στη φόρμα web "επιλογή παραγγελίας" και αντί για το ID, πρέπει να αντικαταστήσετε τα αντίστοιχα πεδία από άλλες στήλες.

Ο κώδικας:
$query = "SELECT * FROM list";
$result = mysql_query($query);
ενώ($row=mysql_fetch_array($result. // λήψη αποτελεσμάτων από κάθε σειρά
( echo "";// εμφάνιση δεδομένων
}




CREATE TABLE "table_name" ("id" int(255) NOT NULL AUTO_INCREMENT, "list" text (80) NOT NULL, PRIMARY KEY("id".

INSERT INTO "table_name" ("list") VALUES ("bla-bla")



καλύτερη απάντηση $ερώτημα =
"
επιλέξτε εταιρείες.Εταιρεία, επισκευή_τύποι.Επισκευή_τύποι, list.comment_l
από τη λίστα
εσωτερικές εταιρίες σύνδεσης
στη λίστα.Ποιος = εταιρείες.c_id
επισκευή_τύποι εσωτερικής σύνδεσης
στη λίστα."What need" = repair_types.r_id
";

Φυσικά, οι εικόνες, τα αρχεία ήχου, οι πληροφορίες βίντεο, τα δεδομένα κινούμενων εικόνων και οι μικροεφαρμογές αποτελούν σημαντικό μέρος του περιεχομένου του Παγκόσμιου Ιστού, αλλά η συντριπτική πλειονότητα των δεδομένων στον Ιστό εξακολουθεί να έχει τη μορφή κειμένου - ακολουθιών χαρακτήρων όπως αυτή η πρόταση. Ο βασικός τύπος δεδομένων PHP για την αναπαράσταση κειμένου είναι μια συμβολοσειρά.

Περιγραφή συμβολοσειρών στην PHP

Οι συμβολοσειρές είναι ακολουθίες χαρακτήρων που μπορούν να αντιμετωπιστούν ως μια ενιαία οντότητα - εκχωρούνται σε μεταβλητές, μεταβιβάζονται ως είσοδος σε συναρτήσεις, επιστρέφονται από συναρτήσεις ή αποστέλλονται ως έξοδοι για εμφάνιση στην ιστοσελίδα του χρήστη. Ο απλούστερος τρόπος για να καθορίσετε μια συμβολοσειρά σε κώδικα PHP είναι να περικλείσετε μια ακολουθία χαρακτήρων σε εισαγωγικά, μονό ("") ή διπλό ("), για παράδειγμα, ως εξής:

$myString = "Απλή συμβολοσειρά"; $anotherString = "Μια άλλη συμβολοσειρά";

Η διαφορά μεταξύ μεμονωμένων και διπλών εισαγωγικών οφείλεται στο πόσο εκτενώς ερμηνεύει το περιβάλλον PHP τους χαρακτήρες που αναφέρονται πριν από τη δημιουργία της πραγματικής συμβολοσειράς. Εάν η συμβολοσειρά περικλείεται σε μονά εισαγωγικά, τότε δεν εκτελείται σχεδόν καμία ερμηνεία και εάν η συμβολοσειρά περικλείεται σε διπλά εισαγωγικά, τότε το περιβάλλον PHP εκτελεί την αντικατάσταση των τιμών όλων των μεταβλητών που καθορίζονται στη συμβολοσειρά και επίσης αντικαθιστά ορισμένες ειδικές ακολουθίες χαρακτήρων που ξεκινούν με την ανάστροφη κάθετο χαρακτήρων ().

Για παράδειγμα, μετά την επεξεργασία του ακόλουθου κώδικα που είναι μέρος μιας ιστοσελίδας:

$count = 13; $string1 = "Η συμβολοσειρά \"Hello, world!\" περιέχει $count χαρακτήρες.
"; $string2 = "Η συμβολοσειρά \"Hello, world!\" περιέχει $count χαρακτήρες.
"; echo $string1; echo $string2;

μπορείτε να περιμένετε να λάβετε την ακόλουθη έξοδο στο παράθυρο του προγράμματος περιήγησης:

Αντικατάσταση τιμής με σγουρά σιδεράκια

Στις περισσότερες περιπτώσεις, μπορείτε απλά να περικλείσετε τη μεταβλητή σε μια συμβολοσειρά με διπλά εισαγωγικά και η τιμή της μεταβλητής θα αντικατασταθεί στη συμβολοσειρά όταν ο διερμηνέας επεξεργάζεται τη συμβολοσειρά. Ωστόσο, στις δύο περιπτώσεις που περιγράφονται παρακάτω, μπορεί να αποδειχθεί ότι ο διερμηνέας συμβολοσειρών δεν είναι σε θέση να λάβει τεκμηριωμένη απόφαση και χρειάζεται πρόσθετη καθοδήγηση από τον προγραμματιστή.

Η πρώτη περίπτωση είναι ότι ο διερμηνέας δεν μπορεί να προσδιορίσει πού τελειώνει το όνομα της μεταβλητής και η δεύτερη κατάσταση εμφανίζεται όταν είναι απαραίτητο να αντικαταστήσει στη συμβολοσειρά την τιμή μιας απλής μεταβλητής, αλλά την τιμή μιας έκφρασης. Σε αυτές τις περιπτώσεις, ο προγραμματιστής μπορεί να διευκρινίσει περικλείοντας το όνομα ή την έκφραση που πρόκειται να υποβληθεί σε επεξεργασία σε σγουρά άγκιστρα (()).

Για παράδειγμα, ο διερμηνέας PHP δεν έχει πρόβλημα με την επεξεργασία του παρακάτω κώδικα:

$sport = "βόλεϊ"; $play = "Μου αρέσει να παίζω $sport.";

Σε τέτοιες περιπτώσεις, ο διερμηνέας συναντά τον χαρακτήρα $ και, στη συνέχεια, αρχίζει να υπογραμμίζει τους χαρακτήρες για να αποκαλύψει το όνομα της μεταβλητής και το κάνει μέχρι να συναντήσει ένα διάστημα ή μια τελεία που ακολουθεί το όνομα της μεταβλητής $sport. Τα κενά και οι τελείες δεν μπορούν να αποτελούν μέρος ενός ονόματος μεταβλητής, επομένως γίνεται σαφές ότι η εν λόγω μεταβλητή ονομάζεται $sport. Μετά από αυτό, ο διερμηνέας PHP βρίσκει με επιτυχία την τιμή για τη δεδομένη μεταβλητή ("volleyball") και την αντικαθιστά.

Αλλά μερικές φορές δεν είναι δυνατό να επισημάνετε το τέλος ενός ονόματος μεταβλητής με ένα κενό ή μια τελεία. Εξετάστε το ακόλουθο παράδειγμα:

$sport1 = "θα"; $sport2 = "πόδι"; $sport3 = "καλάθι"; // Εσφαλμένες κατασκευές $play1 = "Μου αρέσει να παίζω $sport1ball."; $play2 = "Μου αρέσει να παίζω $sport2ball."; $play3 = "Μου αρέσει να παίζω $sport3ball.";

Σε αυτήν την περίπτωση, το επιθυμητό αποτέλεσμα δεν θα επιτευχθεί, επειδή ο διερμηνέας PHP θα θεωρήσει τη συμβολοσειρά $sport1 ως μέρος του ονόματος της μεταβλητής $sport1bol, στην οποία, προφανώς, δεν έχει εκχωρηθεί καμία τιμή. Αντίθετα, πρέπει να χρησιμοποιήσετε τον ακόλουθο συμβολισμό:

// Έγκυρη κατασκευή $play1 = "Μου αρέσει να παίζω ($sport1)ball."; $play2 = "Μου αρέσει να παίζω ($sport2)ball."; $play3 = "Μου αρέσει να παίζω ($sport3)ball.";

Αυτή η σημείωση λέει στον διερμηνέα PHP ότι μόνο η τιμή της έκφρασης με το όνομα της μεταβλητής περικλείεται σε σγουρά άγκιστρα πρέπει να αξιολογηθεί πριν από την αντικατάσταση τιμής.

Για παρόμοιους λόγους, ο διερμηνέας PHP, εάν δεν χρησιμοποιούνται σγουρά άγκιστρα, δυσκολεύεται να αντικαταστήσει τις τιμές των σύνθετων εκφράσεων με ονόματα μεταβλητών, όπως η πρόσβαση σε στοιχεία πολυδιάστατων πινάκων και μεταβλητών αντικειμένων. Ο γενικός κανόνας είναι ότι εάν ένα ανοιγόμενο σγουρό άγκιστρο (() ακολουθείται αμέσως από ένα $, τότε ο διερμηνέας PHP αξιολογεί την τιμή της έκφρασης με το όνομα της μεταβλητής μέχρι το σγουρό άγκιστρο κλεισίματος ()) και στη συνέχεια αντικαθιστά την τιμή που προκύπτει στη χορδή. (Εάν θέλετε να εμφανίζεται μια κυριολεκτική τιμή ($) στη συμβολοσειρά, αυτό μπορεί να γίνει με το πρόθεμα καθενός από αυτούς τους χαρακτήρες με μια ανάστροφη κάθετο, \).

Χαρακτήρες και δείκτες χαρακτήρων σε συμβολοσειρές

Σε αντίθεση με κάποιες άλλες γλώσσες προγραμματισμού, η PHP δεν έχει ξεχωριστό τύπο χαρακτήρων που να μην είναι ίδιος με τον τύπο συμβολοσειράς. Σε γενικές γραμμές, οι συναρτήσεις που απαιτούν πραγματικές παραμέτρους χαρακτήρων σε άλλες γλώσσες έχουν σχεδιαστεί για να λαμβάνουν συμβολοσειρές μήκους 1 στην PHP.

Η επιλογή μεμονωμένων χαρακτήρων από μια συμβολοσειρά μπορεί να γίνει καθορίζοντας έναν αριθμό ακολουθίας χαρακτήρων με βάση το μηδέν, ο οποίος πρέπει να καθοριστεί σε σγουρές αγκύλες αμέσως μετά το όνομα της μεταβλητής συμβολοσειράς. Τέτοιοι χαρακτήρες είναι στην πραγματικότητα συμβολοσειρές ενός χαρακτήρα. Για παράδειγμα, εκτελώντας τον ακόλουθο κώδικα:

$myString = "Διπλασιάστηκε"; για ($index = 0; $index< strlen($myString); $index++) { $char = $myString{$index}; print("$char$char"); }

έχει ως αποτέλεσμα την ακόλουθη έξοδο στο παράθυρο του προγράμματος περιήγησης:

Προφανώς, κάθε χαρακτήρας της συμβολοσειράς εκτυπώνεται δύο φορές σε κάθε πέρασμα μέσα από τον βρόχο. Η συνάρτηση strlen() επιστρέφει το μήκος μιας συμβολοσειράς.

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

Η PHP παρέχει δύο λειτουργίες συμβολοσειράς: τον τελεστή κουκκίδας (.), ή τελεστή συνένωσης, και τον τελεστή κουκκίδας και ίσου (.=), ή τελεστή συνένωσης και εκχώρησης. Εξετάστε το ακόλουθο παράδειγμα:

$string1 = "Αυτό είναι ένα μέρος"; $string2 = "χορδές"; // Σύνδεση συμβολοσειρών echo $string1." απλό ".$string2."
"; // "Αυτό είναι μέρος μιας απλής συμβολοσειράς" // Συνενώστε και εκχωρήστε $string1 .= " simple "; // Ισοδυναμεί με $string1 = $string1." simple "; $string1 .= $string2; echo $string1; // "Αυτό είναι μέρος μιας απλής συμβολοσειράς"

Θα πρέπει να σημειωθεί ότι στο παραπάνω παράδειγμα, η πρώτη δήλωση echo δεν μεταβιβάζεται σε πολλές πραγματικές παραμέτρους συμβολοσειράς. μεταβιβάζεται μόνο μία πραγματική παράμετρος συμβολοσειράς, που προκύπτει από τη συνένωση τεσσάρων συμβολοσειρών. Η πρώτη και η τρίτη γραμμή ορίζονται χρησιμοποιώντας μεταβλητές και η δεύτερη και η τέταρτη γραμμή είναι μια κυριολεκτική συμβολοσειρά που περικλείεται σε διπλά εισαγωγικά.

Δομή σύνταξης δευτερεύοντος εγγράφου (Heredoc)

Εκτός από τις συντακτικές δομές των συμβολοσειρών σε μονά και διπλά εισαγωγικά, η PHP παρέχει έναν άλλο τρόπο για τον καθορισμό μιας συμβολοσειράς, που ονομάζεται η συντακτική δομή του ένθετου εγγράφου (Heredoc). Όπως αποδείχθηκε, μια τέτοια συντακτική δομή είναι ένα πολύ βολικό μέσο για τον καθορισμό μεγάλων τμημάτων κειμένου που αντικαθίστανται χρησιμοποιώντας μεταβλητές, καθώς εξαλείφει την ανάγκη του χρήστη να ορίσει εσωτερικά εισαγωγικά χρησιμοποιώντας ειδικούς χαρακτήρες. Αυτή η μέθοδος είναι ιδιαίτερα χρήσιμη όταν δημιουργείτε σελίδες που περιέχουν φόρμες HTML.

Το σύμβολο τελεστή που χρησιμοποιείται στη συντακτική δομή του δευτερεύοντος εγγράφου είναι (<<<). За этим знаком должна непосредственно следовать метка (не заключенная в кавычки), которая обозначает начало многострочного текста. Интерпретатор PHP продолжает включать в состав значения переменной следующие строки до тех пор, пока снова не появится эта же метка в начале строки. За заключительной меткой может следовать необязательная точка с запятой, а какие-либо другие символы после метки не допускаются.

Εξετάστε το ακόλουθο παράδειγμα:

$string =<<

ΕΟΤ; echo $string;

Σημειώστε ότι η τελευταία λέξη ΕΟΤ που εμφανίζεται παραπάνω δεν πρέπει να έχει καθόλου εσοχή, διαφορετικά θα θεωρηθεί ότι ανήκει στο πρόσθετο κείμενο που περιλαμβάνεται. Δεν είναι απαραίτητο να χρησιμοποιήσετε τη λέξη "EOT" ως ετικέτα, η ετικέτα μπορεί να έχει οποιοδήποτε όνομα, ακολουθώντας τις συνήθεις συμβάσεις ονομασίας μεταβλητών PHP.

Η αντικατάσταση μεταβλητής γίνεται χρησιμοποιώντας ακριβώς την ίδια μέθοδο όπως όταν χρησιμοποιούνται συμβολοσειρές που περικλείονται σε διπλά εισαγωγικά. Ένα βολικό χαρακτηριστικό ενός ένθετου εγγράφου είναι ότι μπορείτε να εισάγετε εισαγωγικά στο κείμενο που ορίζεται με αυτόν τον τρόπο χωρίς τη χρήση χαρακτήρων ελέγχου και αυτό δεν οδηγεί σε πρόωρη ολοκλήρωση του σχηματισμού γραμμής. Το παράδειγμα που φαίνεται παραπάνω βγάζει μια απλή φόρμα HTML:

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

Η γλώσσα PHP παρέχει μια μεγάλη ποικιλία λειτουργιών για την επεξεργασία και τη μετατροπή συμβολοσειρών. Εάν χρειαστεί ποτέ να δημιουργήσετε τη δική σας συνάρτηση που διαβάζει και επεξεργάζεται συμβολοσειρές χαρακτήρα προς χαρακτήρα για να σχηματίσει μια νέα συμβολοσειρά, σκεφτείτε πρώτα εάν κάποιος άλλος μπορεί να είχε αντιμετωπίσει μια παρόμοια εργασία στο παρελθόν. Και αν η διαίσθηση υποδηλώνει ότι υπάρχει μια τέτοια πιθανότητα, τότε ίσως υπάρχει μια ενσωματωμένη λειτουργία που λύνει το πρόβλημα. Για περισσότερες πληροφορίες σχετικά με τις συναρτήσεις συμβολοσειράς, ανατρέξτε στη διεύθυνση https://php.net/manual/en/ref.strings.php.

Αυτή η ενότητα εισάγει τις βασικές λειτουργίες για τον έλεγχο, τη σύγκριση, την τροποποίηση και την εκτύπωση συμβολοσειρών. Για να κατακτήσετε πραγματικά τις εγκαταστάσεις χειρισμού συμβολοσειρών της PHP, φαίνεται ότι θα πρέπει να έχετε τουλάχιστον μια πρόχειρη εξοικείωση με όλα όσα καλύπτονται σε αυτήν την ενότητα. Μια περιγραφή των λειτουργιών που έχουν σχεδιαστεί για να λειτουργούν με κανονικές εκφράσεις μπορείτε να βρείτε στο παρακάτω άρθρο.

Επικύρωση συμβολοσειράς

Ποιες είναι οι πιο συνηθισμένες ερωτήσεις σχετικά με τις συμβολοσειρές που πρέπει να απαντηθούν; Πρώτο στη λίστα των ερωτήσεων είναι το ερώτημα πόσο μήκος είναι μια συμβολοσειρά. για να απαντηθεί, χρησιμοποιείται η συνάρτηση strlen(), το όνομα της οποίας είναι συντομογραφία για το μήκος συμβολοσειράς - το μήκος της συμβολοσειράς. Ένα παράδειγμα χρήσης μιας τέτοιας συνάρτησης φαίνεται παρακάτω:

$enStr = "Γεια σου κόσμο!"; $rusStr = "Απλή συμβολοσειρά"; echo $enStr." - χαρακτήρες ".strlen($enStr).".
"; echo $rusStr." - ".strlen($rusStr)." χαρακτήρες"?

Η εκτέλεση αυτού του κώδικα παράγει την ακόλουθη διφορούμενη έξοδο:

Όπως μπορείτε να δείτε, για τη συμβολοσειρά "Hello world!" το αποτέλεσμα είναι σωστό, αλλά για τη συμβολοσειρά "Απλή συμβολοσειρά" το αποτέλεσμα των 27 χαρακτήρων είναι λάθος. Τι συμβαίνει εδώ; Το γεγονός είναι ότι η συνάρτηση strlen() μετράει byte, όχι χαρακτήρες. Στην πρώτη περίπτωση, όλοι οι χαρακτήρες στη συμβολοσειρά είναι στα αγγλικά, δηλ. αντιπροσωπεύονται με κωδικοποίηση ASCII και κωδικοποιούνται ως 1 byte. Στη δεύτερη περίπτωση, η συμβολοσειρά περιέχει ρωσικούς χαρακτήρες, οι οποίοι κωδικοποιούνται σε 2 byte (UTF-8). Για να αποφύγετε προβλήματα αργότερα κατά την εργασία με συναρτήσεις συμβολοσειράς, η PHP θα πρέπει να χρησιμοποιεί συναρτήσεις για κωδικοποιήσεις πολλών byte που ξεκινούν με το πρόθεμα mb_. Αυτό σημαίνει ότι στο προηγούμενο παράδειγμα, πρέπει να αντικαταστήσετε τη συνάρτηση strlen() με mb_strlen() και να καθορίσετε ρητά την κωδικοποίηση:

Echo $rus_str." - ".mb_strlen($rus_str, "UTF8")." χαρακτήρες";

Εύρεση χαρακτήρων και υποσυμβολοσειρών

Η επόμενη ερώτηση σχετικά με τις χορδές είναι τι περιέχουν. Για παράδειγμα, η συνάρτηση strpos() σάς επιτρέπει να βρείτε τον αριθμό θέσης ενός συγκεκριμένου χαρακτήρα σε μια συμβολοσειρά, εάν υπάρχει:

$enStr = "Γεια σου κόσμο!"; echo "Σύμβολο "l": ".strpos($enStr, "l"); // 2

Οι καταστάσεις που περιλαμβάνουν τη χρήση της συνάρτησης strpos() είναι περιπτώσεις στις οποίες η έλλειψη ευαισθησίας τύπου της PHP μπορεί να είναι πρόβλημα. Εάν δεν βρεθεί αντιστοίχιση, τότε η συνάρτηση επιστρέφει μια ψευδή τιμή και εάν ο επιθυμητός χαρακτήρας ταιριάζει με τον πρώτο χαρακτήρα της συμβολοσειράς, τότε η συνάρτηση επιστρέφει 0 (επειδή ο αριθμός των θέσεων χαρακτήρων στη συμβολοσειρά ξεκινά από το 0, όχι από το 1). Και οι δύο αυτές τιμές αντιστοιχούν σε false όταν χρησιμοποιούνται για τον έλεγχο μιας boolean συνθήκης. Ένας τρόπος για να γίνει διάκριση μεταξύ αυτών των τιμών είναι να χρησιμοποιήσετε τον τελεστή σύγκρισης ταυτότητας (τον τελεστή ===, που εισήχθη από την PHP4), ο οποίος επιστρέφει true μόνο εάν οι τελεστές του είναι οι ίδιοι και είναι του ίδιου τύπου. Ο τελεστής σύγκρισης ταυτότητας μπορεί να χρησιμοποιηθεί για να ελέγξει εάν η τιμή επιστροφής είναι 0 (ή ψευδής) χωρίς τον κίνδυνο σύγχυσης της τιμής επιστροφής με άλλες τιμές που μπορεί να γίνουν ίδιες μετά το cast.

Η συνάρτηση strpos() μπορεί επίσης να χρησιμοποιηθεί για την αναζήτηση μιας υποσυμβολοσειράς και όχι ενός μεμονωμένου χαρακτήρα. Για να γίνει αυτό, αρκεί να καθορίσετε μια συμβολοσειρά πολλών χαρακτήρων, και όχι μια συμβολοσειρά μονού χαρακτήρων, ως την επιθυμητή. Επιπλέον, στην κλήση σε αυτήν τη συνάρτηση, μπορείτε να καθορίσετε μια πρόσθετη ακέραια παράμετρο που καθορίζει τη θέση έναρξης της αναζήτησης.

Είναι επίσης δυνατή η αναζήτηση προς την αντίθετη κατεύθυνση, από το τέλος της χορδής στην αρχή. Για αυτό χρησιμοποιείται η συνάρτηση strrpos(). (Σημειώστε ότι αυτή η συνάρτηση έχει ένα επιπλέον r στο όνομά της, το οποίο είναι σύντομο για το αντίστροφο.) Αυτή η συνάρτηση λαμβάνει ως παραμέτρους τη συμβολοσειρά για αναζήτηση και τη συμβολοσειρά μονού χαρακτήρων για αναζήτηση και, στη συνέχεια, επιστρέφει τις εμφανίσεις τελευταίας θέσης της δεύτερης παραμέτρου στην πρώτη παράμετρο. (Σε αντίθεση με τη συνάρτηση strpos(), στη συνάρτηση strrpos(), η συμβολοσειρά που αναζητήθηκε πρέπει να αποτελείται από έναν μόνο χαρακτήρα.) Μετά την εφαρμογή αυτής της συνάρτησης με τις ίδιες παραμέτρους όπως στο προηγούμενο παράδειγμα, θα βρεθεί μια άλλη θέση:

$enStr = "Γεια σου κόσμο!"; echo "Σύμβολο "l": ".strrpos($enStr, "l"); // 9 επειδή Η αναζήτηση είναι από το τέλος της συμβολοσειράς

Σύγκριση

Ταιριάζει αυτή η γραμμή με αυτήν τη γραμμή; Προφανώς, ο κώδικας συχνά πρέπει να απαντήσει και σε αυτήν την ερώτηση, ειδικά όταν πρόκειται για τον χειρισμό εισόδου από τον τελικό χρήστη.

Η απλούστερη μέθοδος για την εύρεση της απάντησης στο ερώτημα εάν οι συμβολοσειρές είναι ίδιες είναι η χρήση του τελεστή σύγκρισης απλής ισότητας (==), ο οποίος ελέγχει την ισότητα όχι μόνο των συμβολοσειρών, αλλά και των αριθμών. Όταν χρησιμοποιείται ο τελεστής ==, δύο συμβολοσειρές θεωρούνται ίδιες εάν περιέχουν ακριβώς τις ίδιες ακολουθίες χαρακτήρων. Αυτό δεν ελέγχει για έναν πιο αυστηρό ορισμό των πανομοιότυπων συμβολοσειρών, όπως η προϋπόθεση ότι αυτές οι συμβολοσειρές αποθηκεύονται στην ίδια διεύθυνση στη μνήμη, αλλά είναι διάκριση πεζών-κεφαλαίων (με άλλα λόγια, εάν τα συγκριτικά γράμματα είναι κεφαλαία ή πεζά) .

Τα αποτελέσματα της σύγκρισης δύο συμβολοσειρών χρησιμοποιώντας τον τελεστή == (ή τους αντίστοιχους τελεστές< и >) μπορεί να είναι αξιόπιστη μόνο εάν και οι δύο τελεστές είναι συμβολοσειρές και είναι γνωστό ότι δεν έχει πραγματοποιηθεί μετατροπή τύπου. Και τα αποτελέσματα του ελέγχου χρησιμοποιώντας τη συνάρτηση strcmp(), η οποία περιγράφεται παρακάτω, μπορούν πάντα να είναι αξιόπιστα.

Η πιο σημαντική συνάρτηση σύγκρισης συμβολοσειρών που κάνει το μεγαλύτερο μέρος της εργασίας είναι η strcmp(). Αυτή η συνάρτηση παίρνει δύο συμβολοσειρές ως παραμέτρους και συγκρίνει byte byte μέχρι να βρει διαφορά. Στη συνέχεια, η συνάρτηση επιστρέφει έναν αρνητικό αριθμό εάν η πρώτη συμβολοσειρά είναι μικρότερη από τη δεύτερη και έναν θετικό αριθμό εάν η δεύτερη συμβολοσειρά είναι μικρότερη από την πρώτη. Εάν οι συμβολοσειρές είναι ίδιες, η συνάρτηση strcmp() επιστρέφει μηδέν.

Η συνάρτηση strcasecmp() λειτουργεί με τον ίδιο τρόπο, εκτός από το ότι η σύγκριση για την ισότητα είναι χωρίς διάκριση πεζών-κεφαλαίων. Για παράδειγμα, μια κλήση στο strcasecmp("hey!", "HEY!") θα πρέπει να επιστρέψει μηδέν.

Αναζήτηση

Οι συναρτήσεις σύγκρισης που μόλις περιγράφηκαν σάς ενημερώνουν εάν μια συμβολοσειρά είναι ίση με μια άλλη συμβολοσειρά. Και για να προσδιορίσετε εάν μια συμβολοσειρά περιέχεται σε μια άλλη, χρησιμοποιήστε τη συνάρτηση strpos() που περιγράφεται παραπάνω ή τη συνάρτηση strstr() και παρόμοιες συναρτήσεις.

Η συνάρτηση strstr() λαμβάνει ως παραμέτρους τη συμβολοσειρά προς αναζήτηση και τη συμβολοσειρά προς αναζήτηση (με αυτή τη σειρά). Εάν είναι επιτυχής, αυτή η συνάρτηση επιστρέφει το τμήμα της συμβολοσειράς που ξεκινά με την πρώτη εμφάνιση της συμβολοσειράς αναζήτησης (και περιλαμβάνει τη συμβολοσειρά αναζήτησης). Εάν δεν βρεθεί τέτοια συμβολοσειρά, η συνάρτηση επιστρέφει false. Το ακόλουθο απόσπασμα κώδικα παρέχει παραδείγματα για τον τρόπο χρήσης αυτής της συνάρτησης:

$str = "Γεια σου κόσμο!"; $findStr = "κόσμος"; echo "Substring" $findStr" στην αρχική συμβολοσειρά: ".strstr($str, $findStr);

Όπως η συνάρτηση strcmp(), η συνάρτηση strstr() έχει μια έκδοση χωρίς διάκριση πεζών-κεφαλαίων που ονομάζεται stristr() (το i σε αυτό το όνομα είναι συντομογραφία για insensitive). Η συνάρτηση stristr() είναι πανομοιότυπη με τη συνάρτηση strstr() από όλες τις απόψεις, εκτός από το ότι η σύγκριση αντιμετωπίζει τα πεζά γράμματα ως τα αντίστοιχα κεφαλαία.

Επιλογή υποσυμβολοσειράς

Πολλές συναρτήσεις συμβολοσειρών PHP εκτελούν λειτουργίες αποκοπής και επικόλλησης σε συμβολοσειρές. Μια περικοπή είναι μια επιλογή ενός τμήματος μιας συμβολοσειράς και μια εισαγωγή είναι μια επιλεκτική τροποποίηση μιας συμβολοσειράς. Λάβετε υπόψη ότι ακόμη και οι συναρτήσεις εισαγωγής (τις περισσότερες φορές) δεν τροποποιούν τη συμβολοσειρά που δίνεται ως παράμετρος εισόδου. Συνήθως, τέτοιες λειτουργίες επιστρέφουν ένα τροποποιημένο αντίγραφο και αφήνουν αμετάβλητη την αρχική παράμετρο.

Ο απλούστερος τρόπος για να κάνετε δείγμα μέρους μιας συμβολοσειράς είναι να χρησιμοποιήσετε τη συνάρτηση substr(), η οποία επιστρέφει μια νέα συμβολοσειρά που περιέχει μέρος μιας υποακολουθίας χαρακτήρων από την παλιά συμβολοσειρά. Η συνάρτηση substr() λαμβάνει ως παραμέτρους μια συμβολοσειρά (από την οποία θα δειγματιστεί η υποσυμβολοσειρά), έναν ακέραιο (τη θέση από την οποία ξεκινά η επιθυμητή υποσυμβολοσειρά) και μια προαιρετική τρίτη παράμετρος ακέραιος που καθορίζει το μήκος της επιθυμητής υποσυμβολοσειράς. Εάν η τρίτη παράμετρος δεν έχει καθοριστεί, τότε η υποσυμβολοσειρά θεωρείται ότι συνεχίζει μέχρι το τέλος της συμβολοσειράς. (Θα πρέπει να θυμόμαστε ότι όταν χρησιμοποιείτε αυτήν τη συνάρτηση, η αρίθμηση των θέσεων σε μια συμβολοσειρά ξεκινά από το μηδέν και όχι από το ένα, όπως σε όλες τις παραμέτρους της συνάρτησης PHP που υποδεικνύουν αριθμητικές θέσεις σε συμβολοσειρές.) Για παράδειγμα:

$str = "Γεια σου κόσμο!"; echo mb_substr($str, 7, 3, "UTF8"); // "κόσμος"

Τόσο η παράμετρος θέσης έναρξης όσο και η παράμετρος μήκους μπορεί να είναι αρνητικές, αλλά και στις δύο αυτές περιπτώσεις, μια αρνητική τιμή έχει διαφορετική σημασία. Εάν η αρχική θέση είναι αρνητική, τότε η θέση του αρχικού χαρακτήρα της υποσυμβολοσειράς προσδιορίζεται μετρώντας αντίστροφα από το τέλος της συμβολοσειράς, αντί να μετράμε προς τα εμπρός από την αρχή της συμβολοσειράς. (Μια αρχική θέση -1 υποδηλώνει ότι η μέτρηση ξεκινά από τον τελευταίο χαρακτήρα, η τιμή -2 υποδηλώνει τον προτελευταίο χαρακτήρα και ούτω καθεξής.)

Με βάση αυτό, θα μπορούσε κανείς να υποθέσει ότι μια αρνητική τιμή μήκους υποδηλώνει επίσης ότι η υποσυμβολοσειρά θα πρέπει να προσδιορίζεται μετρώντας αντίστροφα από τον αρχικό χαρακτήρα, αντί να μετράμε προς τα εμπρός, αλλά αυτό δεν συμβαίνει. Ο ισχυρισμός ότι ο χαρακτήρας στην αρχική θέση είναι ο πρώτος χαρακτήρας στην επιστρεφόμενη συμβολοσειρά (και όχι ο τελευταίος) ισχύει πάντα. Αντίθετα, μια αρνητική παράμετρος μήκους σημαίνει ότι ο χαρακτήρας λήξης καθορίζεται μετρώντας αντίστροφα από το τέλος, αντί να μετράμε προς τα εμπρός από την αρχική θέση.

Ακολουθούν μερικά παραδείγματα με θετικές και αρνητικές παραμέτρους:

$str = "Γεια σου κόσμο!"; echo mb_substr($str, 7, 3, "UTF8")."
"; // "world" echo mb_substr($str, -4, 3, "UTF8")."
"; // "world" echo mb_substr($str, 0, -5, "UTF8")."
"; // "Γεια"

Αφαίρεση διαστημάτων και καρτελών από συμβολοσειρές

Τεχνικά, οι συναρτήσεις chop(), ltrim() και trim() είναι συναρτήσεις για εργασία με υποσυμβολοσειρές (που μοιάζουν πολύ με άλλες συναρτήσεις), αλλά στην πραγματικότητα, αυτές οι συναρτήσεις έχουν σχεδιαστεί για να αφαιρούν ανεπιθύμητους χαρακτήρες από συμβολοσειρές. Οι συναρτήσεις chop(), ltrim() και trim(), αντίστοιχα, αφαιρούν χαρακτήρες κενού διαστήματος μετάδοσης, προπορευόμενου, προπορευόμενου και τελικού κενού από μια συμβολοσειρά που δίνεται ως η μόνη παράμετρος συμβολοσειράς.

Εκτός από τα κενά, αυτές οι συναρτήσεις αφαιρούν άλλους χαρακτήρες κενού διαστήματος, όπως αυτούς που υποδεικνύονται από τις ακολουθίες διαφυγής \n, \r, \t και \0 (χαρακτήρες τέλους γραμμής, καρτέλες και μηδενικοί χαρακτήρες που χρησιμοποιούνται για την επισήμανση του τέλους μιας γραμμής σε προγράμματα C).

Στην PHP, είναι σύνηθες να χρησιμοποιείται μια συνάρτηση για την αφαίρεση του κενού διαστήματος στο τέλος μιας συμβολοσειράς που ονομάζεται chop(), αλλά μπορεί επίσης να κληθεί μια πανομοιότυπη συνάρτηση, πιο περιγραφική ονομασία rtrim(). Τέλος, πρέπει να σημειωθεί ότι η συνάρτηση chop(), παρά το γεγονός ότι το όνομά της, που σημαίνει "κόψιμο", ακούγεται πολύ απειλητικό, δεν καταστρέφει την αρχική παράμετρο $original, η οποία διατηρεί την προηγούμενη τιμή.

Αντικατάσταση χορδής

Όλες οι συναρτήσεις συμβολοσειράς που συζητήθηκαν παραπάνω προέβλεπαν την ανάκτηση μέρους της παραμέτρου εισόδου, αντί για το σχηματισμό μιας εντελώς νέας συμβολοσειράς. Αυτή η ενότητα συζητά τις συναρτήσεις str_replace() και substr_replace() για αυτόν τον σκοπό.

Η συνάρτηση str_replace() σάς επιτρέπει να αντικαταστήσετε όλες τις εμφανίσεις μιας συγκεκριμένης υποσυμβολοσειράς με μια άλλη συμβολοσειρά. Αυτή η συνάρτηση παίρνει τρεις παραμέτρους: τη συμβολοσειρά που θα αναζητηθεί, τη δευτερεύουσα συμβολοσειρά που θα αντικατασταθεί αφού βρεθεί και τη συμβολοσειρά που θα χρησιμοποιηθεί για την αντικατάσταση. Εξετάστε το ακόλουθο παράδειγμα:

$str = "Γεια σου κόσμο!"; echo str_replace("world", "planet", $str); // "Γεια σου πλανήτη!"

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

Όπως φαίνεται παραπάνω, η συνάρτηση str_replace() επιλέγει το τμήμα της συμβολοσειράς πηγής που θα αντικατασταθεί αναζητώντας εμφανίσεις της επιθυμητής υποσυμβολοσειράς στη συμβολοσειρά πηγής. Αντίθετα, η substr_replace() επιλέγει το εξάρτημα που θα αντικατασταθεί από την απόλυτη θέση του. Αυτή η συνάρτηση απαιτεί έως και τέσσερις παραμέτρους: τη συμβολοσειρά που θα αντικατασταθεί, τη συμβολοσειρά που θα χρησιμοποιηθεί ως αντικατάσταση, την αρχική θέση της αντικατάστασης και (ως προαιρετική παράμετρος) το μήκος της συμβολοσειράς που πρόκειται να αντικατασταθεί. Εξετάστε το ακόλουθο παράδειγμα:

echo substr_replace("ABCDEFG", "-", 2, 3); // "AB-FG"

Το τμήμα CDE της συμβολοσειράς έχει αντικατασταθεί με έναν μόνο χαρακτήρα. Σημειώστε ότι σε αυτήν την περίπτωση επιτρεπόταν η αντικατάσταση μιας υποσυμβολοσειράς με μια συμβολοσειρά διαφορετικού μήκους. Εάν παραληφθεί η παράμετρος μήκους, τότε θεωρείται ότι αντικαθίσταται ολόκληρο το τμήμα της συμβολοσειράς μετά τη θέση έναρξης.

Η συνάρτηση substr_replace() δέχεται επίσης αρνητικές παραμέτρους ως αρχική θέση και μήκος, οι οποίες αντιμετωπίζονται ακριβώς όπως στην παραπάνω συνάρτηση substr(). Είναι σημαντικό να θυμάστε ότι ως αποτέλεσμα λειτουργιών που εκτελούνται χρησιμοποιώντας τις συναρτήσεις str_replace και substr_replace, η αρχική συμβολοσειρά παραμένει αμετάβλητη.

Τέλος, υπάρχει μια σειρά από λιγότερο ευρέως χρησιμοποιούμενες συναρτήσεις που σχηματίζουν νέες συμβολοσειρές από παλιές. Η συνάρτηση strrev() απλώς επιστρέφει μια νέα συμβολοσειρά με τους χαρακτήρες στη συμβολοσειρά εισόδου να αντιστρέφονται. Η συνάρτηση str_repeat() παίρνει μια συμβολοσειρά και μια ακέραια παράμετρο και επιστρέφει μια συμβολοσειρά που περιέχει τον καθορισμένο αριθμό αντιγράφων της παραμέτρου συμβολοσειράς:

echo str_repeat("ABC", 3); // ABCABCABC

Λειτουργίες μετατροπής θήκης

Αυτές οι λειτουργίες σάς επιτρέπουν να μετατρέπετε πεζά γράμματα σε κεφαλαία και αντίστροφα. Η συνάρτηση strtolower() επιστρέφει μια συμβολοσειρά με όλα τα γράμματα να έχουν μετατραπεί σε πεζά. Δεν έχει σημασία αν η αρχική συμβολοσειρά περιείχε μόνο κεφαλαία γράμματα ή κεφαλαία και πεζά. Για παράδειγμα:

$str = "Γεια σου κόσμο!"; echo mb_strtolower($str, "UTF8"); // "Γειά σου Κόσμε!"

Εάν έχετε ήδη βιώσει την ανάγκη να κάνετε πολλή επικύρωση φόρμας, ίσως έχετε παρατηρήσει ότι η συνάρτηση strtolower() είναι ένα εξαιρετικά εύχρηστο εργαλείο για το χειρισμό διευθύνσεων email που λαμβάνονται από χρήστες που εξακολουθούν να μην γνωρίζουν ότι οι διευθύνσεις email είναι πεζές -αναίσθητος. Όχι λιγότερο χρήσιμες είναι και άλλες λειτουργίες που σχετίζονται με αυτήν την κατηγορία.

Η συνάρτηση strtoupper() επιστρέφει μια συμβολοσειρά με όλα τα γράμματα να έχουν μετατραπεί σε κεφαλαία. Ένα παράδειγμα είναι το ακόλουθο απόσπασμα κώδικα:

$str = "Γεια σου κόσμο!"; echo mb_strtoupper($str, "UTF8"); // "ΓΕΙΑ ΣΟΥ ΚΟΣΜΕ!"

Η συνάρτηση ucfirst() γράφει κεφαλαία μόνο το πρώτο γράμμα της συμβολοσειράς, η συνάρτηση ucwords() γράφει κεφαλαία το πρώτο γράμμα κάθε λέξης στη συμβολοσειρά. Ούτε η συνάρτηση ucwords() ούτε ucfirst() έχει παρόμοια λειτουργία για κωδικοποίηση πολλαπλών byte, επομένως δεν είναι συμβατές με κυριλλικές συμβολοσειρές.

Λειτουργίες για την εισαγωγή χαρακτήρων ελέγχου

Ένα από τα πλεονεκτήματα της γλώσσας PHP είναι ότι μπορεί να χρησιμοποιηθεί για την ανταλλαγή δεδομένων με σχεδόν οποιοδήποτε σύστημα. Τα μέσα αυτού του είδους θεωρούνται συνήθως ως ένα είδος "κόλλας λογισμικού". Σε αυτόν τον ρόλο, η γλώσσα PHP χρησιμοποιείται για αλληλεπίδραση με διακομιστές βάσης δεδομένων, διακομιστές LDAP, για ανταλλαγή δεδομένων μέσω υποδοχών και της ίδιας της σύνδεσης HTTP. Συχνά αυτή η αλληλεπίδραση πραγματοποιείται δημιουργώντας πρώτα μια συμβολοσειρά μηνύματος (όπως ένα ερώτημα βάσης δεδομένων) και μετά περνώντας αυτό το μήνυμα στο πρόγραμμα λήψης. Αλλά τα προγράμματα συχνά δίνουν ιδιαίτερο νόημα σε ορισμένους χαρακτήρες, και ως εκ τούτου πρέπει να μετατραπούν σε χαρακτήρες ελέγχου. Αυτό σημαίνει ότι το πρόγραμμα λήψης έχει εντολή να αντιμετωπίζει αυτούς τους χαρακτήρες ως κυριολεκτικό μέρος της συμβολοσειράς, αντί να εφαρμόζει ειδική μεταχείριση σε αυτούς.

Πολλοί χρήστες, για να αντιμετωπίσουν αυτό το πρόβλημα, ενεργοποιούν τη χρήση του λεγόμενου "magic quote mode", που διασφαλίζει ότι τα εισαγωγικά μετατρέπονται σε χαρακτήρες ελέγχου πριν εισαχθούν συμβολοσειρές σε βάσεις δεδομένων. Αλλά εάν ένας τέτοιος τρόπος επεξεργασίας δεν είναι εφικτός ή επιθυμητός, τότε πρέπει να χρησιμοποιήσει κανείς το παλιό καλό μέσο εισαγωγής χαρακτήρων ανάστροφης κάθετου και στη συνέχεια αφαίρεσης αυτών των χαρακτήρων.

Η συνάρτηση addslashes() μετατρέπει μονά και διπλά εισαγωγικά, ανάστροφες κάθετες και μηδενικούς χαρακτήρες σε ακολουθίες διαφυγής χρησιμοποιώντας ανάστροφες κάθετες, καθώς αυτοί είναι οι χαρακτήρες που συνήθως πρέπει να μετατραπούν σε ακολουθίες διαφυγής κατά την προετοιμασία ερωτημάτων σε βάσεις δεδομένων:

$escapedstring = addslashes("Συμβολοσειρά με "εισαγωγικά"."); $query = "INSERT INTO test (εισαγωγικό) τιμές ("$escapedstring")"; $result = mysqli_query($link, $query) ή die(mysql_error());

Η εκτέλεση αυτού του κώδικα αποτρέπει την παρερμηνεία της δήλωσης SQL σαν η συμβολοσειρά να τελείωνε ακριβώς πριν από το γράμμα "k". Και μετά τη λήψη αυτών των δεδομένων, πρέπει να χρησιμοποιήσετε τη συνάρτηση stripslashes() για να αφαιρέσετε τις ανάστροφες κάθετες.

Η συνάρτηση quotemeta() μετατρέπει ένα ευρύτερο σύνολο χαρακτήρων σε ακολουθίες διαφυγής. Όλοι αυτοί οι χαρακτήρες έχουν συνήθως ειδικές σημασίες στη γραμμή εντολών του Unix: " . ", " " ", " + ", " * ", " ? ", " [ ", " ] ", " ^ ", " (", " $ " και ")". Για παράδειγμα, εκτελώντας τον ακόλουθο κώδικα:

$str = "Αυτοί οι χαρακτήρες ($, *, ^) πρέπει να μετατραπούν."; echo quotemeta($str);

βγάζει αυτή τη γραμμή:

Λειτουργίες εξόδου σε μια εξωτερική συσκευή και σε μια γραμμή

Οι κύριες κατασκευές που χρησιμοποιούνται για την έξοδο είναι η εκτύπωση και η ηχώ, οι οποίες συζητήθηκαν λεπτομερώς νωρίτερα. Ο τυπικός τρόπος για την έξοδο των τιμών των μεταβλητών σε μια εξωτερική συσκευή είναι να συμπεριληφθούν τα ονόματα αυτών των μεταβλητών σε μια συμβολοσειρά με διπλά εισαγωγικά (η οποία επεξεργάζεται ο διερμηνέας για να αντικαταστήσει τις τιμές των μεταβλητών) και στη συνέχεια να περάσει αυτή η συμβολοσειρά στην κατασκευή εκτύπωσης ή ηχούς.

Εάν χρειάζεστε ακόμα πιο ακριβή μορφοποιημένη έξοδο, μπορείτε να χρησιμοποιήσετε τις συναρτήσεις printf() και sprintf() της PHP. Αυτές οι δύο συναρτήσεις λαμβάνουν τις ίδιες παραμέτρους: μια συμβολοσειρά ειδικής μορφής που ακολουθείται από έναν αυθαίρετο αριθμό άλλων παραμέτρων που αντικαθίστανται στις σωστές θέσεις στη συμβολοσειρά μορφοποίησης για να παράγουν ένα αποτέλεσμα. Η μόνη διαφορά μεταξύ printf() και sprintf() είναι ότι η printf() στέλνει τη συμβολοσειρά αποτελέσματος απευθείας στην εξωτερική συσκευή που χρησιμοποιείται για έξοδο, ενώ η sprintf() επιστρέφει τη συμβολοσειρά αποτελέσματος ως αποτέλεσμα της εκτέλεσής της.

Λίγα λόγια για έμπειρους προγραμματιστές C. Αυτή η έκδοση του sprintf() διαφέρει ελαφρώς από την έκδοση C στο ότι η sprintf() δεν χρειάζεται να παρέχει μια εκχωρημένη συμβολοσειρά για εγγραφή, καθώς ο διερμηνέας PHP εκχωρεί μνήμη για τη συμβολοσειρά που προκύπτει για λογαριασμό του ο χρήστης.

Η κύρια δυσκολία που σχετίζεται με τη χρήση αυτών των συναρτήσεων είναι ο σωστός ορισμός της συμβολοσειράς μορφής. Κάθε χαρακτήρας στη συμβολοσειρά μορφοποίησης εμφανίζεται απευθείας στην τιμή που προκύπτει, εκτός από τους χαρακτήρες % και τους χαρακτήρες που ακολουθούν αμέσως αυτούς τους χαρακτήρες. Το σύμβολο % σηματοδοτεί την αρχή μιας προδιαγραφής μετατροπής, η οποία καθορίζει τον τρόπο εξαγωγής σε μια εξωτερική συσκευή μιας από τις παραμέτρους που ακολουθεί τη συμβολοσειρά μορφοποίησης.

Μετά το σύμβολο %, υπάρχουν πέντε στοιχεία που συνθέτουν την προδιαγραφή μετατροπής, τα οποία περιγράφονται παρακάτω, μερικά από τα οποία είναι προαιρετικά: γέμιση, ευθυγράμμιση, ελάχιστο πλάτος, ακρίβεια και τύπος:

  • Για να υποδείξετε εάν ένας αριθμός είναι αρνητικός, χρησιμοποιείται ένας προαιρετικός συμβολισμός με τη μορφή αρνητικού (-).
  • Ο μοναδικός (προαιρετικός) χαρακτήρας συμπλήρωσης είναι είτε 0 είτε κενό (). Αυτό το σύμβολο χρησιμοποιείται για να γεμίσει οποιοδήποτε χώρο που διαφορετικά θα έμενε κενός, αλλά ο χρήστης επέμενε να επιλέξει (ορίζοντας την παράμετρο ελάχιστου πλάτους πολύ ψηλά). Εάν αυτός ο χαρακτήρας συμπλήρωσης δεν έχει καθοριστεί, από προεπιλογή γίνεται συμπλήρωση με κενά.
  • Ο προαιρετικός χαρακτήρας αιτιολόγησης (-) καθορίζει εάν η τιμή εξόδου θα πρέπει να είναι αιτιολογημένη με αριστερά ή δεξιά. Εάν έχει καθοριστεί αυτός ο χαρακτήρας, τότε η τιμή θα είναι αιτιολογημένη με αριστερά και αν δεν υπάρχει, εφαρμόζεται δεξιά αιτιολόγηση.
  • Μια προαιρετική αριθμητική τιμή ελάχιστου πλάτους που καθορίζει τον ελάχιστο αριθμό θέσεων που πρέπει να καταλαμβάνει η τιμή εξόδου. (Εάν οι τιμές εξόδου απαιτούν περισσότερες θέσεις χαρακτήρων από τις καθορισμένες, τότε η τιμή εξόδου είναι εκτός εύρους.)
  • Ένας προαιρετικός προσδιοριστής ακριβείας, μορφοποιημένος ως τελεία (.) ακολουθούμενος από έναν αριθμό. Ο προσδιοριστής υποδεικνύει με ποια ακρίβεια, μετρούμενη με τον αριθμό των δεκαδικών ψηφίων μετά το σημείο, θα πρέπει να εξάγεται ένας αριθμός κινητής υποδιαστολής διπλής ακρίβειας. (Η εφαρμογή αυτής της προδιαγραφής δεν έχει καμία επίδραση στην έξοδο δεδομένων εκτός από αριθμούς κινητής υποδιαστολής διπλής ακρίβειας.)
  • Ένας μόνο χαρακτήρας που υποδεικνύει πώς πρέπει να ερμηνεύεται ο τύπος τιμής. Ο χαρακτήρας f υποδηλώνει ότι η τιμή πρέπει να εκτυπωθεί ως αριθμός κινητής υποδιαστολής διπλής ακρίβειας, ο χαρακτήρας s υποδεικνύει ότι η τιμή πρέπει να εκτυπωθεί ως συμβολοσειρά και οι υπόλοιποι πιθανοί χαρακτήρες (b, c, d, o, x, X ) υποδεικνύουν ότι η τιμή πρέπει να ερμηνεύεται ως ακέραιος και να εξάγεται σε διάφορες μορφές. Αυτές οι μορφές είναι b για έξοδο σε δυαδική μορφή, c για έξοδο χαρακτήρα με την αντίστοιχη τιμή κωδικού ASCII, o για έξοδο σε οκταδική μορφή, x για έξοδο σε δεκαεξαδική μορφή (με πεζά γράμματα ψηφίων). ), και X για εμφάνιση δεκαεξαδικοί αριθμοί που χρησιμοποιούν κεφαλαία γράμματα ως κυριολεκτικά σύμβολα για ψηφία.

Το παρακάτω είναι ένα παράδειγμα εξόδου του ίδιου αριθμού κινητής υποδιαστολής διπλής ακρίβειας με πολλούς διαφορετικούς τρόπους:

%10f 
%-10στ
%2.2f", $value, $value, $value, $value); ?>

Παράγει τα ακόλουθα αποτελέσματα:

Η κατασκευή που χρησιμοποιείται σε αυτό το παράδειγμα

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

Λειτουργίες για εργασία με κώδικα HTML

Η PHP παρέχει έναν αριθμό συναρτήσεων για το χειρισμό συμβολοσειρών που περιέχουν δεδομένα ειδικά για τον ιστό. Μια επισκόπηση αυτών των χαρακτηριστικών παρέχεται στον παρακάτω πίνακα:

Συναρτήσεις συμβολοσειράς σχεδιασμένες να λειτουργούν με κώδικα HTML

Λειτουργία Περιγραφή
htmlspecialchars() Παίρνει μια συμβολοσειρά ως παράμετρο και επιστρέφει μια συμβολοσειρά στην οποία τέσσερις χαρακτήρες που έχουν ειδική σημασία στη γλώσσα HTML έχουν αντικατασταθεί με ειδικές συμβολοσειρές. Καθένας από αυτούς τους χαρακτήρες αντικαθίσταται από το αντίστοιχο στοιχείο HTML, το οποίο αντικαθίσταται ξανά από τον αρχικό χαρακτήρα όταν επεκτείνεται το κείμενο της σελίδας στο πρόγραμμα περιήγησης. Ο χαρακτήρας & αντικαθίσταται από το στοιχείο & χαρακτήρας " (χαρακτήρας διπλού εισαγωγικού) - από τον χαρακτήρα "< - < а символ > - >
htmlentities() Εκτελεί πιο ολοκληρωμένη επεξεργασία από το htmlspecialchars(), δηλ. αντικαθιστά με το στοιχείο HTML όχι μόνο ειδικούς χαρακτήρες, αλλά και όλους τους χαρακτήρες για τους οποίους παρέχεται η αντικατάσταση από το στοιχείο HTML
get_html_translation_table() Λαμβάνει μία από τις δύο ειδικές σταθερές (HTML_SPECIAL_CHARS ή HTML_ENTITIES) και επιστρέφει έναν πίνακα μετατροπών που χρησιμοποιείται από τις συναρτήσεις htmlspecialchars() ή htmlentities() αντίστοιχα. Ο πίνακας αναζήτησης είναι ένας πίνακας του οποίου τα κλειδιά είναι συμβολοσειρές χαρακτήρων και του οποίου οι αντίστοιχες τιμές είναι συμβολοσειρές για την αντικατάστασή τους.
nl2br() Λαμβάνει μια συμβολοσειρά ως παράμετρο και επιστρέφει την ίδια συμβολοσειρά, αλλά με περιγραφείς
, εισάγεται πριν από όλους τους χαρακτήρες τέλους γραμμής (\n, \r ή \r\n). Η ανάγκη χρήσης αυτής της λειτουργίας προκύπτει, για παράδειγμα, εάν θέλετε να παρέχετε την ίδια παραγράφου του κειμένου που εμφανίζεται στο πρόγραμμα περιήγησης όπως στο κείμενο προέλευσης
strip_tags() Λαμβάνει μια συμβολοσειρά ως παράμετρο και κάνει ό,τι καλύτερο μπορεί για να σχηματίσει μια συμβολοσειρά απαλλαγμένη από όλους τους περιγραφείς HTML και όλους τους περιγραφείς PHP

Κατακερματισμός δεδομένων χρησιμοποιώντας τον αλγόριθμο MD5

Ο αλγόριθμος MD5 είναι ένας αλγόριθμος επεξεργασίας συμβολοσειρών που χρησιμοποιείται για τη δημιουργία μιας λεγόμενης σύνοψης ή ψηφιακής υπογραφής για οποιαδήποτε συμβολοσειρά που μεταβιβάζεται ως παράμετρος. Ο αλγόριθμος δημιουργεί μια συμβολοσειρά σταθερού μήκους με βάση τη συμβολοσειρά εισόδου, που αποτελείται από 32 δεκαεξαδικά ψηφία (0-9, a-f). Τα αποτελέσματα που παράγονται από τον αλγόριθμο MD5 έχουν πολύ χρήσιμες ιδιότητες, που περιγράφονται παρακάτω:

  • Ο αλγόριθμος MD5 διασφαλίζει πάντα ότι η συμβολοσειρά εξόδου είναι η ίδια όταν δίνεται η ίδια συμβολοσειρά εισόδου, επομένως η κρυπτογράφηση MD5 δεν μπορεί να χρησιμοποιηθεί για την αποθήκευση κωδικών πρόσβασης.
  • Τα αποτελέσματα της εφαρμογής του αλγορίθμου MD5 έχουν σταθερό μήκος και είναι πολύ ομοιόμορφα κατανεμημένα σε όλο το εύρος των πιθανών τιμών.
  • Μπορεί να δημιουργηθεί μια συμβολοσειρά εισόδου που αντιστοιχεί σε μια δεδομένη συμβολοσειρά εξόδου του αλγόριθμου MD5 ή μπορούν να δημιουργηθούν δύο συμβολοσειρές εισόδου, η επεξεργασία των οποίων θα οδηγούσε στην ίδια συμβολοσειρά εξόδου, αλλά μόνο υπό ορισμένες συνθήκες.

Η υλοποίηση του αλγόριθμου MD5 από την PHP είναι διαθέσιμη ως συνάρτηση md5(), η οποία παίρνει μια συμβολοσειρά ως είσοδο και παράγει τα αποτελέσματα ως σύνοψη 32 χαρακτήρων. Για παράδειγμα, εκτελώντας τον ακόλουθο κώδικα:

$str = "Γεια σου κόσμο!"; echo "Κωδικός κατακερματισμού για τη συμβολοσειρά "$str": ".md5($str)."
"; $str = "Γεια, κόσμο!"; echo "Κωδικός κατακερματισμού για τη συμβολοσειρά "$str": ".md5($str)."
"; $str = "Hello world"; echo "Κωδικός κατακερματισμού για τη συμβολοσειρά "$str": ".md5($str)."
";

έχει ως αποτέλεσμα τα ακόλουθα αποτελέσματα στο παράθυρο του προγράμματος περιήγησης:

Φυσικά, σε αυτήν την περίπτωση, όλες οι συμβολοσειρές εισόδου είναι πολύ παρόμοιες μεταξύ τους, αλλά οι συμβολοσειρές εξόδου δεν έχουν ορατή ομοιότητα. Επιπλέον, το εύρος των πιθανών τιμών εξόδου είναι εξαιρετικά μεγάλο (1632), επομένως η πιθανότητα επεξεργασίας δύο διαφορετικών συμβολοσειρών (που θα παράγουν την ίδια τιμή MD5) είναι εξαιρετικά απίθανη.

Λόγω των παραπάνω χαρακτηριστικών του αλγορίθμου MD5, οι τιμές που λαμβάνονται με τη βοήθειά του μπορούν να χρησιμοποιηθούν για την επίλυση μιας μεγάλης ποικιλίας προβλημάτων, συμπεριλαμβανομένων αυτών που περιγράφονται παρακάτω:
Υπολογισμός του αθροίσματος ελέγχου ενός μηνύματος ή αρχείου
Για να ελέγξετε εάν το μήνυμα ήταν κατεστραμμένο κατά τη μετάδοση, μπορείτε να στείλετε μια σύνοψη MD5 μαζί με το μήνυμα και να δημιουργήσετε ξανά την ανακεφαλαίωση MD5 όταν ληφθεί το μήνυμα. Εάν οι δύο εκδόσεις της σύνοψης δεν ταιριάζουν, τότε έγινε διαφθορά κατά τη μετάδοση.
Ελέγξτε εάν τα περιεχόμενα ενός αρχείου παραμένουν αμετάβλητα
Αυτή η εργασία είναι παρόμοια με την εργασία του υπολογισμού του αθροίσματος ελέγχου. Ο αλγόριθμος MD5 χρησιμοποιείται συχνά για την εκτέλεση αυτής της λειτουργίας στις μηχανές αναζήτησης, όταν απαιτείται να ελέγχεται περιοδικά εάν μια ιστοσελίδα έχει αλλάξει και να ευρετηριάζεται εκ νέου εάν είναι απαραίτητο. Το γεγονός είναι ότι για περαιτέρω επαλήθευση είναι πολύ πιο εύκολο να οργανωθεί η αποθήκευση του MD5 digest παρά ολόκληρο το αρχείο προέλευσης.
Διαχωρισμός πολλαπλών συμβολοσειρών ή αρχείων σε υποσύνολα
Για να λύσετε το πρόβλημα του διαχωρισμού ενός συνόλου συμβολοσειρών σε Ν τυχαία επιλεγμένα υποσύνολα, μπορείτε να υπολογίσετε την ανάλυση MD5 κάθε συμβολοσειράς, να πάρετε τους πρώτους δεκαεξαδικούς χαρακτήρες, να τους μετατρέψετε σε αριθμό, να λάβετε το modulo modulo αυτού του αριθμού και να το χρησιμοποιήσετε υπόλοιπο ως αριθμός υποσυνόλου, στον οποίο πρέπει να γραφτεί αυτή η γραμμή.

Εκτός από τη συνάρτηση md5(), η PHP παρέχει τη συνάρτηση md5_file(), η οποία παίρνει ένα όνομα αρχείου ως παράμετρο και επιστρέφει μια κατακερματισμένη τιμή MD5 που αντιστοιχεί στα περιεχόμενα του αρχείου.

Λειτουργίες σχεδιασμένες να αξιολογούν την ομοιότητα των χορδών

Στην πράξη, συχνά καθίσταται απαραίτητο να προσδιοριστεί πόσο όμοιες είναι οι δύο χορδές. Προφανώς, τα αποτελέσματα της εκτίμησης της ομοιότητας συμβολοσειρών εξαρτώνται από το τι σημαίνει η έννοια της ομοιότητας συμβολοσειρών.

Εάν η ομοιότητα στην ορθογραφία θεωρείται ως κριτήριο για την αξιολόγηση της ομοιότητας, τότε μπορεί κανείς να εφαρμόσει Μετρική Levenshtein. Η συνάρτηση levenshtein() παίρνει δύο συμβολοσειρές ως παραμέτρους και επιστρέφει τον ελάχιστο αριθμό πράξεων προσθήκης, διαγραφής και αντικατάστασης χαρακτήρων που απαιτούνται για τη μετατροπή μιας συμβολοσειράς σε άλλη. Εξετάστε ένα παράδειγμα:

echo levenshtein ("Tim", "Time"); // 1 echo levenshtein("boy", "chefboyardee"); // 9 echo levenshtein("ποτέ", "έξυπνος"); // 2

Εάν η φωνητική ομοιότητα θεωρείται ως κριτήριο ομοιότητας, τότε οι συναρτήσεις soundex() και metaphone() μπορούν να χρησιμοποιηθούν για την αξιολόγηση της ομοιότητας. Και οι δύο αυτές συναρτήσεις λαμβάνουν την εν λόγω συμβολοσειρά ως είσοδο και επιστρέφουν μια συμβολοσειρά κλειδιού που υποδεικνύει την κατηγορία προφοράς της δεδομένης λέξης (η οποία αντιμετωπίζεται ως αγγλική λέξη). Εάν δύο λέξεις που χρησιμοποιούνται ως περιεχόμενο μιας συμβολοσειράς εισόδου αντιστοιχούν ακριβώς στην ίδια τιμή εξόδου, τότε είναι πιθανό να προφέρονται το ίδιο.

Λειτουργίες ανάλυσης και διακριτοποίησης

Μερικές φορές καθίσταται απαραίτητο για ένα πρόγραμμα να χωρίσει τις συμβολοσειρές σε στοιχεία, καθοδηγούμενο από τον δικό του ορισμό του τι πρέπει να θεωρείται στοιχείο. Η διαδικασία διαχωρισμού μιας μεγάλης χορδής σε μέρη ονομάζεται tokenization. Συγκεκριμένα, μια τέτοια διαδικασία αποτελεί μέρος της γενικής διαδικασίας για την ερμηνεία ή τη μεταγλώττιση οποιουδήποτε προγράμματος υπολογιστή, συμπεριλαμβανομένου ενός προγράμματος γραμμένου σε PHP. Η γλώσσα PHP παρέχει μια ειδική λειτουργία για το σκοπό αυτό - strtok ().

Η συνάρτηση strtok() λαμβάνει δύο παραμέτρους: μια συμβολοσειρά για να γίνει διακριτική και μια συμβολοσειρά που περιέχει όλους τους οριοθέτες (χαρακτήρες που αντιμετωπίζονται ως όρια μεταξύ των διακριτικών). Την πρώτη φορά που καλείται, χρησιμοποιούνται και οι δύο παράμετροι και η συνάρτηση επιστρέφει μια τιμή συμβολοσειράς που αντιπροσωπεύει το πρώτο διακριτικό. Για να επιλέξετε τα επόμενα διακριτικά, πραγματοποιείται η ίδια κλήση, αλλά η παράμετρος συμβολοσειράς πηγής παραλείπεται. Η συνάρτηση θυμάται τη διεύθυνση της συμβολοσειράς που δίνεται στην πρώτη παράμετρο και τη χρησιμοποιεί ως τρέχουσα συμβολοσειρά. Επιπλέον, αυτή η λειτουργία θυμάται πού τερματίστηκε η επεξεργασία στην προηγούμενη κλήση. Εξετάστε το ακόλουθο παράδειγμα:

$token = strtok("scripting Web με ενσωματωμένο HTML ανοιχτού κώδικα από την πλευρά του διακομιστή", " "); while($token) ( echo $token."
"; $token = strtok(" "); )

που έχει ως αποτέλεσμα την ακόλουθη έξοδο στο παράθυρο του προγράμματος περιήγησης:

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

Η συνάρτηση strtok() δημιουργεί διακριτικά ένα προς ένα. Μπορείτε επίσης να χρησιμοποιήσετε τη συνάρτηση explode(), η οποία εκτελεί περίπου το ίδιο πράγμα, εκτός από το ότι αποθηκεύει όλα τα διακριτικά ταυτόχρονα σε έναν πίνακα. Αφού λάβετε τα διακριτικά, που αντιπροσωπεύονται ως πίνακας, μπορείτε να εκτελέσετε οποιεσδήποτε λειτουργίες με αυτά, συμπεριλαμβανομένης της ταξινόμησης.

Η συνάρτηση explode() λαμβάνει δύο παραμέτρους: μια συμβολοσειρά οριοθέτη και μια συμβολοσειρά που θα χωριστεί σε διακριτικά. Αυτή η συνάρτηση επιστρέφει έναν πίνακα, κάθε στοιχείο του οποίου είναι μια υποσυμβολοσειρά μεταξύ παρουσιών του οριοθέτη στη συμβολοσειρά που πρόκειται να διαχωριστεί. Εξετάστε το ακόλουθο παράδειγμα:

$explodeResult = explode("AND", "one AND a two AND a three");

που καταλήγει σε έναν πίνακα $explode_result που περιέχει τρία στοιχεία, καθένα από τα οποία είναι μια συμβολοσειρά: "one", "a two" και "a three". Σε αυτό το συγκεκριμένο παράδειγμα, δεν εμφανίζονται κεφαλαία γράμματα σε καμία από τις συμβολοσειρές που περιέχονται στον πίνακα, επειδή το διαχωριστικό AND δεν υπάρχει στο αποτέλεσμα.

Η συμβολοσειρά οριοθέτη που χρησιμοποιείται στη συνάρτηση explode() είναι αρκετά διαφορετική από την οριοθετημένη συμβολοσειρά που χρησιμοποιείται στη συνάρτηση strtok(). Ο οριοθέτης είναι μια πλήρης συμβολοσειρά, επομένως όλοι οι χαρακτήρες σε αυτήν τη συμβολοσειρά πρέπει να βρεθούν στη συμβολοσειρά πηγής με την ίδια σειρά όπως και στον οριοθέτη προκειμένου ο οριοθέτης να θεωρηθεί ότι βρέθηκε.

Από την άλλη πλευρά, μια οριοθετημένη συμβολοσειρά στη συνάρτηση strtok() καθορίζει πολλούς μεμονωμένους χαρακτήρες, καθένας από τους οποίους αντιμετωπίζεται ως οριοθέτης. Αυτό σημαίνει ότι η συνάρτηση explode() είναι πιο επιλεκτική, αλλά πιο επιρρεπής σε θραύση. Συγκεκριμένα, εάν μια μεγάλη συμβολοσειρά χάσει κατά λάθος έστω και έναν χαρακτήρα διαστήματος ή έναν χαρακτήρα τέλους γραμμής που είναι μέρος του οριοθέτη, τότε ολόκληρη η λειτουργία αυτής της συνάρτησης μπορεί να διακοπεί.

Η συνάρτηση explode() έχει μια αντίστροφη συνάρτηση, την implode(), η οποία παίρνει δύο παραμέτρους: μια συμβολοσειρά σύνδεσης (παρόμοια με τη συμβολοσειρά οριοθέτησης στο explode()) και μια σειρά από συμβολοσειρές, παρόμοια με αυτή που επιστρέφεται από την explode(). Η συνάρτηση implode() επιστρέφει μια συμβολοσειρά που δημιουργήθηκε με την εισαγωγή μιας συμβολοσειράς σύνδεσης μεταξύ όλων των διαδοχικών στοιχείων συμβολοσειράς σε έναν πίνακα.