ΚΕΝΤΡΟ ΠΛΗ.ΝΕ.Τ. Ν. ΦΛΩΡΙΝΑΣ

Η Βίβλος της PHP - Μέρος 3β -
Οι Συναρτήσεις : Strings και Regural Expressions

 

Εργασία με Strings

Ο χειρισμός του κειμένου που περιέχεται στα strings (συμβολοσειρές) είναι ένα από τα πιο ενδιαφέροντα αντικείμενα της PHP καθώς η γλώσσα διαθέτει πολλές χρήσιμες συναρτήσεις. Όσον αφορά τα ονόματα των μεταβλητών, η PHP τα αντιμετωπίζει ως case sensitive, δηλ. ξεχωρίζει τα πεζά από τα κεφαλαία γράμματα, κάτι που μπορεί να μας δημιουργήσει προβλήματα αν δεν είμαστε προσεκτικοί αλλά η PHP διαθέτει και παραλλαγές για την κάθε συνάρτηση που είναι case-insensitive, δηλ. δεν ξεχωρίζουν τα πεζά από τα κεφαλαία γράμματα. Θα δούμε και τις κανονικές εκφράσεις (regular expressions ή και regexps), που είναι μεν δύσκολες στην εκμάθηση αλλά πολύ αποτελεσματικές και γρήγορες στον χειρισμό των strings.

 

Διάβασμα Μέρους ενός String

string substr ( string source, int start [, int length])

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

<?php

$string = "Florina per semprel!";

$a = substr($string, 1);

$b = substr($string, 0);

$c = substr($string, 5);

$d = substr($string, 50);

$e = substr($string, 5, 4);

$f = substr($string, 10, 1);

?>

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

lorina per sempre!

Florina per sempre!

na per sempre!


na p

r

Βλέπουμε ότι η μεταβλητή $a περιέχει το κείμενο "lorina per sempre!" και όχι όλο το string καθώς στην PHP τα strings και οι πίνακες (arrays) ξεκινούν από τη θέση 0 και όχι από τη θέση 1, οπότε στην πρώτη εντολή, το κομμάτι αποσπάσθηκε από τον δεύτερο χαρακτήρα και μέχρι το τέλος του string. Στη μεταβλητή $b καταχωρήθηκε ολόκληρο το string καθώς ξεκινήσαμε την απόσπαση από τη θέση (index) 0. Η μεταβλητή $c αντιγράφει από την έκτη θέση, δηλ. index 5. Η μεταβλητή $d ξεκινάει από τη θέση (index) 50, δηλ. τον 51ο χαρακτήρα, που προφανώς είναι το κενό. Βλέπουμε δηλαδή ότι η PHP δεν επιστρέφει κάποιο λάθος (error), απλά ένα κενό (empty) string.

Στη μεταβλητή $e αρχίσαμε να χρησιμοποιούμε και την τρίτη παράμετρος της συνάρτησης, οπότε με τιμές των παραμέτρων 5 και 4, η απόσπαση του κειμένου ξεκινάει από τον 6ο χαρακτήρα (index 5) και αντιγράφει 4 χαρακτήρες. Τέλος, στη μεταβλητή $f έχουμε την απόσπαση ενός χαρακτήρα από τη θέση 11 (index 10), που είναι το "r". Η συνάρτηση substr() μπορεί να δεχθεί και αρνητική τιμή για την τρίτη παράμετρο του μήκους και η PHP θεωρεί αυτόν τον αριθμό ως το πλήθος των χαρακτήρων που θέλουμε να παραλείψουμε από το τέλος του string, σε αντίθεση με το πλήθος των χαρακτήρων που θέλουμε να αποσπάσουμε όταν η τρίτη παράμετρος έχει θετική τιμή. Ακολουθεί ένα χαρακτηριστικό script :

<?php

$string = "Florina per sempre!";

$a = substr($string, 5, 5);

$b = substr($string, 5, -1);

$c = substr($string, 0, -7);

?>

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

na pe

na per sempre

Florina per

Η μεταβλητή $a αντιγράφει 5 χαρακτήρες από τη θέση 6 (index 5), αλλά οι μεταβλητές $b και $c χρησιμοποιούν αρνητικές τιμές, που σημαίνει ότι θα αντιγράψουν ολόκληρο το string εκτός από τους τελευταίους χαρακτήρες. Έτσι, η μεταβλητή $b θα αποσπάσει από τη θέση 6 ολόκληρο το string εκτός από τον τελευταίο χαρακτήρα, ενώ η μεταβλητή $c θα αποσπάσει από τη θέση 1 ολόκληρο το string εκτός από τους 7 τελευταίους χαρακτήρες.

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

<?php

$string = "Florina per sempre!";

$a = substr($string, 5);

$b = substr($string, 5, 5);

$c = substr($string, 0, -1);

$d = substr($string, -5);

$e = substr($string, -5, 4);

$f = substr($string, -5, -4);

?>

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

na per sempre!

na pe

Florina per sempre

mpre!
mpre

m

Ο παραπάνω κώδικας δείχνει όλους τους δυνατούς τρόπους χρήσης της συνάρτησης substr(). Οι τρεις πρώτες εντολές μάς είναι ήδη γνωστές. Η μεταβλητή $a αποσπάει όλους τους χαρακτήρες από τη θέση 6 και μετά, η μεταβλητή $b αποσπάει τους επόμενους 5 χαρακτήρες από τη θέση 6 και η μεταβλητή $c αποσπάει όλους τους χαρακτήρες εκτός από τον τελευταίο. Στη μεταβλητή $d χρησιμοποιούμε μια αρνητική τιμή για τη δεύτερη παράμετρο, την -5, οπότε η $d θα αποσπάσει τους 5 τελευταίους χαρακτήρες του string.

Στη μεταβλητή $e έχουμε μια αρνητική τιμή για τη δεύτερη παράμετρο και μια θετική τιμή για την τρίτη, οπότε η PHP θα μετρήσει 5 χαρακτήρες από το τέλος του string και από εκεί θα αποσπάσει 4 χαρακτήρες. Τέλος, στη μεταβλητή $f έχουμε αρνητική τιμή για τη δεύτερη και για την τρίτη παράμετρο, οπότε η PHP θα μετρήσει 5 χαρακτήρες από το τέλος του string και θα αποσπάσει το υπόλοιπο κομμάτι εκτός από τους 4 τελευταίους χαρακτήρες, δηλ. στην ουσία θα αποσπάσει έναν χαρακτήρα.

 

Αντικατάσταση Μέρους ενός String

mixed str_replace ( mixed search, mixed replace, mixed source [, int &count])

mixed str_ireplace ( mixed search, mixed replace, mixed source [, int &count])

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

<?php

$string = "Florina per sempre";

$newstring = str_replace("Florina", "Amyntaio", $string);

print $newstring;

?>

Σύμφωνα με τον παραπάνω κώδικα, το $newstring θα έχει το περιεχόμενο "Amyntaio per sempre". Ας δούμε και το επόμενο κομμάτι κώδικα :

<?php

$string = "Florina per sempre";

$newstring = str_replace("florina", "amyntaio", $string);

print $newstring;

?>

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

<?php

$string = "Florina per sempre";

$newstring = str_ireplace("florina", "Amyntaio", $string);

print $newstring;

?>

Η τέταρτη προαιρετική παράμετρος μεταβιβάζεται με αναφορά (by reference) και δηλώνει το πόσες φορές βρέθηκε και αντικαστάθηκε το κομμάτι κειμένου. Ακολουθεί ένα παράδειγμα :

<?php

$string = "Επώνυμο – Όνομα : Λουκάς Λουκάς";

$newstring = str_replace("Λουκάς", "Ρίζος", $string, $count);

print "Έγιναν $count αντικαταστάσεις.\n";

?>

Ο παραπάνω κώδικας θα εκτυπώσει το μήνυμα ότι έγιναν δύο αντικαταστάσεις.



 

Μετατροπή Χαρακτήρων σε και από Κώδικα ASCII

string chr ( int ascii)

int ord ( string string)

Ο κώδικας ASCII (American Standard Code for Information Interchange) είναι ένα σύνολο από 255 αριθμούς που αντιστοιχούν σε γράμματα, ψηφία, σύμβολα αλλά και κάποιες ειδικές ενέργειες που χρησιμοποιούμε στους υπολογιστές. Για παράδειγμα, ο κωδικός 74 ανιστοιχεί στο "J", ο κωδικός 106 στο "j", ο 123 είναι το σύμβολο { και ο 32 είναι το κενό διάστημα (space).

Για να μετατρέψουμε έναν κωδικό ASCII στον αντίστοιχο χαρακτήρα, χρησιμοποιούμε τη συνάρτηση chr(), η οποία δέχεται μια τιμή ASCII ως τη μοναδική της παράμετρο, δηλ. έναν αριθμό από το 0 έως το 255, και επιστρέφει τον αντίστοιχο χαρακτήρα. Υπάρχει και η συνάρτηση ord(), η οποία κάνει το ανάποδο, δηλ. δέχεται ένα string ως όρισμα και επιστρέφει τον ισοδύναμο κωδικό ASCII. Ακολουθεί ένα παράδειγμα :

<?php

$mystr = "Florina per sempre\n";

if (ord($mystr{1}) == 83) {

print "Το δεύτερο γράμμα του string είναι το S<br>";

} else {

print "Το δεύτερο γράμμα του string δεν είναι το S<br>";

}

$letter = chr(100);

print "Ο κωδικός ASCII 100 είναι ο $letter<br>";

?>

Το αποτέλεσμα θα είναι το εξής :

Το δεύτερο γράμμα του string δεν είναι το S

Ο κωδικός ASCII 100 είναι ο d

 

Μέτρηση των Strings

int strlen ( string source)

mixed count_chars ( string string [, int mode])

mixed str_word_count ( string string [, int format])

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

<?php

print strlen("Florina") . "\n";                 // 7

print strlen("Goodbye, Perl!") . "\n";     // 14

?>

Οι δύο άλλες συναρτήσεις, η count_chars() και η str_word_count() μετράνε τα περιεχόμενα ενός string με διαφορετικό τρόπο. Η μεν συνάρτηση count_chars() επιστρέφει έναν πίνακα (array) που περιέχει τα γράμματα που χρησιμοποιούνται στο string που της περνάμε ως όρισμα καθώς και πόσες φορές χρησιμοποιήθηκε το κάθε γράμμα, ενώ η συνάρτηση str_word_count() επιστρέφει τον αριθμό των λέξεων (words) που χρησιμοποιούνται. Εξ ορισμού, η συνάρτηση count_chars() επιστρέφει έναν πίνακα από 255 στοιχεία, δηλ. για όλους τους κωδικούς ASCII.

Για να περιοριστούμε μόνο στους χαρακτήρες που υπάρχουν στο string και να μην εμφανιστούν έτσι όλοι οι κωδικοί ASCII, μπορούμε να περάσουμε μια δεύτερη παράμετρο στη συνάρτηση, όπου η τιμή 1 εμφανίζει μόνο τους χαρακτήρες που εμφανίζονται μία τουλάχιστον φορά και η τιμή 2 εμφανίζει μόνο τους χαρακτήρες που δεν εμφανίζονται καθόλου. Παρόμοια, μπορούμε να περάσουμε μια δεύτερη παράμετρο και στη συνάρτηση str_word_count(), η οποία εξ ορισμού επιστρέφει τον αριθμό των μοναδικών λέξεων που υπάρχουν στο string.

Όμως, αν περάσουμε το 1 ως τη δεύτερη παράμετρο θα επιστρέψει έναν πίνακα (array) με τις λέξεις (words) που βρέθηκαν, ενώ αν περάσουμε το 2 θα κάνει το ίδιο εκτός από το ότι το κλειδί (key) της κάθε λέξης θα γίνει ίσο με τη θέση που βρέθηκε να κατέχει η λέξη μέσα στο string. Ακολουθεί ένα παράδειγμα και με τις δύο συναρτήσεις :

<?php

$str = "Florina per sempre, per sempre, per sempre!";

$a = count_chars($str, 1);

$b = str_word_count($str, 1);

$c = str_word_count($str, 2);

$d = str_word_count($str);

print_r($a);

print "<br>";

print_r($b);

print "<br>";

print_r($c);

print "<br>";

echo "Υπάρχουν $d λέξεις στο κείμενο<br>";

?>

Το αποτέλεσμα θα είναι το εξής :

Array ( [32] => 6 [33] => 1 [44] => 2 [70] => 1 [97] => 1 [101] => 9 [105] => 1 [108] => 1 [109] => 3 [110] => 1

[111] => 1 [112] => 6 [114] => 7 [115] => 3 )

Array ( [0] => Florina [1] => per [2] => sempre [3] => per [4] => sempre [5] => per [6] => sempre )

Array ( [0] => Florina [8] => per [12] => sempre [20] => per [24] => sempre [32] => per [36] => sempre )

Υπάρχουν 7 λέξεις στο κείμενο

Στην πρώτη εκτύπωση του πίνακα, οι κωδικοί ASCII χρησιμοποιούνται για τους αριθμούς μέσα στις αγκύλες (που είναι τα κλειδιά του πίνακα) και οι συχνότητες εμφάνισης του κάθε γράμματος χρησιμοποιούνται ως οι τιμές του πίνακα. Δηλαδή, ο κωδικός ASCII 32 (space) υπάρχει 6 φορές, ο κωδικός ASCII 33 (!) υπάρχει 1 φορά, ο κωδικός ASCII 101 (e) υπάρχει 9 φορές κοκ.

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

 

Εύρεση ενός String Μέσα σ’ ένα Άλλο String

int strpos ( string haystack, string needle [, int offset])

int stripos ( string haystack, string needle [, int offset])

Η συνάρτηση strpos() και η αντίστοιχή της case-insensitive, stripos(), επιστρέφουν τη θέση (index) της πρώτης εμφάνισης ενός κειμένου (substring) μέσα σ’ ένα άλλο string. Ακολουθεί ένα παράδειγμα :

<?php

$string = "Florina per sempre!";

print strpos($string, "a") . "\n";

?>

Ο παραπάνω κώδικας θα επιστρέφει την τιμή 6 καθώς σ’ αυτή τη θέση βρίσκεται ο χαρακτήρας a. Δεν θα πρέπει να ξεχνάμε ότι η PHP θεωρεί ότι το πρώτο γράμμα ενός string είναι στη θέση (index) 0. Μπορούμε να ορίσουμε και ολόκληρες λέξεις αντί για γράμματα στη δεύτερη παράμετρο, οπότε η συνάρτηση strpos() θα επιστρέψει την πρώτη εμφάνιση της λέξης μέσα στο string, όπως για παράδειγμα, η εντολή strpos($string, "per") που θα επιστρέψει την τιμή 8. Αν το substring που ορίζεται στη δεύτερη παράμετρο δεν βρεθεί στην πρώτη παράμετρο, η συνάρτηση strpos() θα επιστρέψει την τιμή false. Ακολουθεί ένα χαρακτηριστικό script :

<?php

$string = "Αυτό είναι ένα test";

$pos = strpos($string, "Αυτό");

if ($pos == false) {

print "Δεν βρέθηκε\n";

} else {

print "Βρέθηκε\n";

}

?>

Αν εκτελέσουμε το παραπάνω script, θα δούμε ότι εμφανίζεται το μήνυμα "Δεν βρέθηκε", αν και η λέξη "Αυτό" βρίσκεται μέσα στο $string. Το πρόβλημα οφείλεται στο ότι η λέξη βρίσκεται στην αρχή του $string, οπότε η συνάρτηση strpos() θα επιστρέψει την τιμή 0. Όμως, η PHP θεωρεί ότι το 0 είναι το ίδιο με την τιμή false, που σημαίνει ότι η εντολή if μπερδεύεται και δεν μπορεί να ξεχωρίσει τις δύο περιπτώσεις, δηλ. αν το substring δεν βρέθηκε ή αν το substring βρέθηκε και είναι στη θέση 0.

Για να δώσουμε τη λύση σ’ αυτές τις περιπτώσεις, υπάρχει ο τελεστής, = = =, ο οποίος ελέγχει αν δύο τιμές είναι ίδιες αλλά και του ιδίου τύπου δεδομένων. Αν η λέξη "Αυτό" βρεθεί μέσα στο $string, η συνάρτηση strpos() θα επιστρέψει την τιμή 0, αλλά με τύπο δεδομένων integer και όχι boolean. Έτσι, μπορούμε να διορθώσουμε το script ως εξής :

<?php

$string = "Αυτό είναι ένα test";

$pos = strpos($string, "Αυτό");

if ($pos === false) {

print "Δεν βρέθηκε\n";

} else {

print "Βρέθηκε\n";

}

?>

Αν εκτελέσουμε το παραπάνω script, θα δούμε ότι εμφανίζεται το μήνυμα "Βρέθηκε". Στο επόμενο script προσπαθούμε να εντοπίσουμε τον χαρακτήρα "e" μέσα στο string :

<?php

$string = "Florina per sempre";

$pos = strpos($string, "e");

if ($pos === false) {

print "Δεν βρέθηκε\n";

} else {

print "Βρέθηκε στη θέση $pos\n";

}

?>

Αν εκτελέσουμε το παραπάνω script, θα δούμε ότι εμφανίζεται το μήνυμα "Βρέθηκε στη θέση 9". Η συνάρτηση strpos() βρίσκει την πρώτη εμφάνιση του χαρακτήρα "e", η οποία είναι στη λέξη "per" και μπορεί να μην μας ικανοποιεί. Υπάρχει λοιπόν και μια τρίτη παράμετρος με την οποία μπορούμε να προσδιορίσουμε από πού θα αρχίσει η αναζήτηση. Έτσι, αν θέλουμε να αποφύγουμε τη λέξη "per", θα πρέπει να ορίσουμε να αρχίσει η αναζήτηση από τη θέση 11, δηλ. αμέσως μετά από τη λέξη "per", ως εξής :

<?php

$string = "Florina per sempre";

$pos = strpos($string, "e", 11);

if ($pos === false) {

print "Δεν βρέθηκε\n";

} else {

print "Βρέθηκε στη θέση $pos\n";

}

?>

Αν εκτελέσουμε το παραπάνω script, θα δούμε ότι εμφανίζεται το μήνυμα "Βρέθηκε στη θέση 13".

 

Η Πρώτη Εμφάνιση ενός String

string strstr ( string haystack, string needle)

string stristr ( string haystack, string needle)

Η συνάρτηση strstr() και η αντίστοιχή της case-insensitive stristr() βρίσκει την πρώτη εμφάνιση ενός substring (δεύτερη παράμετρος), μέσα σ’ ένα άλλο string (πρώτη παράμετρος) και επιστρέφει όλους τους χαρακτήρες από την πρώτη εμφάνιση μέχρι το τέλος του string. Το επόμενο παράδειγμα προσπαθεί να εντοπίσει το κείμενο www σ’ ένα URL και μετά επιστρέφει ό,τι υπάρχει από εκεί και πέρα μέχρι το τέλος του string :

<?php

$string = "http://www.example.com/mypage.php";

$newstring = strstr($string, "www");

print $newstring;

?>

Αν εκτελέσουμε το παραπάνω script, θα δούμε ότι εμφανίζεται το string www.example.com/mypage.php.

 

Αφαίρεση των Λευκών Χαρακτήρων (Whitespace)

string trim ( string source [, string charlist])

string ltrim ( string source [, string charlist])

string rtrim ( string source [, string charlist])

Η συνάρτηση trim() αφαιρεί τα λευκά κενά (whitespace) και από τις δύο πλευρές ενός string, όπου με τον όρο λευκά κενά εννοούμε τα κενά (spaces), τις αλλαγές γραμμών (new lines) και τα tabs. Δηλαδή, αν έχουμε το string " Florina per sempre " και το μεταβιβάσουμε ως πρώτη παράμετρο στη συνάρτηση trim(), θα επιστραφεί το string "Florina per sempre".

Μπορούμε να χρησιμοποιήσουμε και μια προαιρετική δεύτερη παράμετρο, η οποία είναι ένα string που προσδιορίζει τους χαρακτήρες που θέλουμε να αφαιρέσει η συνάρτηση. Για παράδειγμα, αν περάσουμε ως δεύτερη παράμετρο το string "F" , η συνάρτηση θα επιστρέψει το string "lorina per". Η συνάρτηση trim() είναι case sensitive. Υπάρχουν και οι παρόμοιες συναρτήσεις, ltrim() και rtrim(), όπου η πρώτη αφαιρεί τα λευκά κενά από τα αριστερά και η δεύτερη από τα δεξιά του string. Ακολουθούν μερικά παραδείγματα :

<?php

$a = trim(" testing ");

$b = trim(" testing ", " teng");

$c = ltrim(" testing ");

print $a. "<br>";

print $b."<br>";

print $c."<br>";

?>

Αν εκτελέσουμε το παραπάνω script θα δούμε ότι εμφανίζονται τα εξής :

testing
sti
testing

 

Αναδίπλωση Μεγάλων Strings σε Πολλές Γραμμές

string wordwrap ( string source [, int width [, string break [, boolean cut]]])

Αν και οι ιστοσελίδες αναδιπλώνουν αυτόματα το κείμενό τους, υπάρχουν δύο περιπτώσεις όπου θα θέλαμε να αναδιπλώσουμε εμείς το κείμενο :

Προς τον σκοπό αυτό χρησιμοποιούμε τη συνάρτηση wordwrap(). Αν μεταβιβάσουμε ένα κομμάτι κειμένου στη συνάρτηση χωρίς καμία άλλη παράμετρο, θα επιστρέψει το ίδιο κείμενο με αναδίπλωση στον 75ο χαρακτήρα και με χρήση του γνωστού χαρακρήρα \n. Μπορούμε, όμως, να μεταβιβάσουμε το μέγεθος της γραμμής και έναν χαρακτήρα αλλαγής γραμμής ως τις παραμέτρους δύο και τρία, ως εξής :

<?php

$text = "Η αναδίπλωση κειμένου θα χωρίσει αυτό το κείμενο

σε μικρότερες γραμμές, ώστε να είναι πιο ευανάγνωστο

και με πιο σαφή διάταξη.";

$text = wordwrap($text, 20, "<br />");

print $text;

?>

Η εκτέλεση του παραπάνω script θα δώσει το εξής αποτέλεσμα :

Η αναδίπλωση

κειμένου θα χωρίσει

αυτό το κείμενο σε

μικρότερες γραμμές,

ώστε να είναι πιο

ευανάγνωστο και με

πιο σαφή διάταξη.

Όπως μπορούμε να δούμε, η συνάρτηση wordwrap() χρησιμοποίησε το tag <br />, που είναι το new line marker της HTML, και χώρισε τις λέξεις στον 20ο χαρακτήρα. Αν, όμως, υπάρχουν λέξεις στο κείμενο που περιέχουν περισσότερους από 20 χαρακτήρες, η συνάρτηση δεν θα χωρίσει τη λέξη και έτσι μπορεί να υπάρχουν κομμάτια κειμένου πέρα από το όριο που έχουμε θέσει.

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

<?php

$text = "Η λέξη Πελοπόννησος είναι πολύ μεγάλη.";

$text = wordwrap($text, 6, "<br />", 1);

print $text;

?>

Η εκτέλεση του παραπάνω script θα δώσει το εξής αποτέλεσμα :

Η λέξη
        Πελοπό
        ννησος
        είναι
        πολύ
        μεγάλη
        .

Ενώ η εκτέλεση του εξής script :

<?php

$text = "Η λέξη Πελοπόννησος είναι πολύ μεγάλη.";

$text = wordwrap($text, 6, "<br />");

print $text;

?>

θα δώσει το εξής αποτέλεσμα :

Η λέξη

Πελοπόννησος

είναι
πολύ

μεγάλη.

 

Αλλαγή από Πεζά σε Κεφαλαία

string strtoupper ( string source)

string strtolower ( string source)

string ucfirst ( string source)

string ucwords ( string source)

Η συνάρτηση strtoupper() λαμβάνει ένα string ως παράμετρο και το επιστρέφει με κεφαλαία γράμματα (uppercase). Υπάρχει και η συνάρτηση strtolower(), που μετατρέπει ένα string σε πεζά γράμματα (lowercase), η συνάρτηση ucfirst(), που μετατρέπει το πρώτο γράμμα ενός string σε κεφαλαίο (uppercase) και η συνάρτηση ucwords(), που μετατρέπει το πρώτο γράμμα της κάθε λέξης ενός string σε κεφαλαίο (uppercase). Ακολουθεί ένα χαρακτηριστικό παράδειγμα :

<?php

$string = "μου αρέσει να προγραμματίζω σε PHP";

$a = strtoupper($string);

$b = strtolower($string);

$c = ucfirst($string);

$d = ucwords($string);

$e = ucwords(strtolower($string));

print $a. "<br />";

print $b. "<br />";

print $c. "<br />";

print $d. "<br />";

print $e. "<br />";

?>

Η εκτέλεση του παραπάνω script θα δώσει το εξής αποτέλεσμα :

ΜΟΥ ΑΡΈΣΕΙ ΝΑ ΠΡΟΓΡΑΜΜΑΤΊΖΩ ΣΕ PHP

μου αρέσει να προγραμματίζω σε php

Μου αρέσει να προγραμματίζω σε PHP

Μου Αρέσει Να Προγραμματίζω Σε PHP

Μου Αρέσει Να Προγραμματίζω Σε Php

 

Ο Αλγόριθμος Hash

string sha1 ( string source [, bool raw_output])

Ο όρος SHA σημαίνει "Secure Hash Algorithm" και αποτελεί έναν τρόπο μετατροπής ενός string που έχει ένα οποιοδήποτε μήκος σ’ έναν 16δικό αριθμό των 40 bytes που μπορεί να χρησιμοποιηθεί για επιβεβαίωση κωδικού (verification). Τα hashes είναι ένα είδος κρυπτογράφησης μόνο προς τη μία κατεύθυνση (unidirectional, one-way, encryption) που ο σκοπός τους είναι να ελέγχουν την ακρίβεια της εισόδου.

Αυτό σημαίνει ότι δεν μπορούμε να αποκρυπτογραφήσουμε το αποτέλεσμα ενός αλγορίθμου hash ώστε να πάρουμε το αρχικό κείμενο. Αυτός δεν είναι ο σκοπός μας άλλωστε. Θα δούμε ένα χαρακτηριστικό παράδειγμα. Ας υποθέσουμε ότι έχουμε σε μια ιστοσελίδα χρήστες που καταχωρούν έναν μυστικό κωδικό (password). Πώς μπορούμε να ελέγξουμε αν είναι σωστό το password;

<?php

if ($password == "Florina") {

// ........

}

?>

Το μειονέκτημα του παραπάνω script είναι ότι αν κάποιος διαβάσει τον πηγαίο κώδικα, θα μάθει και το password. Επίσης, αν αποθηκεύσουμε όλα τα passwords των χρηστών σε μια βάση δεδομένων και κάποιος αποκτήσει πρόσβαση σ’ αυτήν, θα μας κάνει μεγάλη ζημιά. Αν, όμως, εφαρμόσουμε τον αλγόριθμο hash στα passwords των χρηστών μας, τότε οι κακόβουλοι χρήστες δεν θα μπορέσουν να ανακτήσουν το αρχικό password. Το μειονέκτημα αυτής της μεθόδου είναι ότι ακόμα και οι εξουσιοδοτημένοι χρήστες δεν θα μπορούν να ανακτήσουν το δικό τους password στην περίπτωση που το χάσουν, οπότε θα πρέπει να αποκτήσουν ένα καινούργιο password.

Η διαδικασία του αλγορίθμου data hashing είναι να λάβουμε μια τιμή και να την μετατρέψουμε σ’ ένα string από γράμματα και αριθμούς με σταθερό μήκος. Δεν υπάρχει κανένας απολύτως τρόπος να αποκρυπτογραφηθεί το αποτέλεσμα ενός αλγορίθμου hash και να βρεθεί η αρχική τιμή. Μετά, το σύστημα ελέγχει αν η αποθηκευμένη τιμή hash είναι ίδια μ’ αυτήν που έχει προκύψει από την εφαρμογή της συνάρτησης, ώστε να βεβαιωθεί ότι ο χρήστης έδωσε το σωστό password. Ακολουθεί ένα χαρακτηριστικό παράδειγμα :

<?php

print sha1("Florina") . "<br />";

print sha1("florina") . "<br />";

print sha1("Florina") . "<br />";

print sha1("This is a very, very, very, very, very, very long test");

?>

Η εκτέλεση του παραπάνω script θα δώσει το εξής αποτέλεσμα :

b6473dd2dde1e90a8b8ab9e3f83d23f119626a1c
758bdfa315e891efd251116d4900f94a4bdd6ea2
b6473dd2dde1e90a8b8ab9e3f83d23f119626a1c
3c008af27b2f6924a3ab3dd6707f0173682b597a

Υπάρχουν τρία πράγματα που παρατηρούμε εδώ : πρώτα, όλες οι έξοδοι αποτελούνται από 40 χαρακτήρες ακριβώς σε μήκος. Δεύτερο, η διαφορά στον κώδικα hash των λέξεων "Florina" και "florina" είναι πολύ μεγάλη αν και οι δύο αυτές λέξεις διαφέρουν πολύ λίγο. Τρίτο, βλέπουμε ότι η συνάρτηση δίνει το ίδιο αποτέλεσμα αν δώσουμε την ίδια είσοδο.

Τέλος, βλέπουμε ότι δεν υπάρχει κάποιος τρόπος να ξεχωρίσουμε αναμεσα στα μεγάλα και τα μικρά strings, επειδή ο κώδικας hash δεν είναι αναστρέψιμος, δηλ. δεν μπορούμε να ανακτήσουμε την αρχική είσοδο αν γνωρίζουμε το αποτέλεσμα του hash, το οποίο αποτελείται σταθερά από 40 bytes, ανεξάρτητα από το μήκος του string. Η συνάρτηση διαθέτει και μια προαιρετική δεύτερη boolean παράμετρο, η οποία αν έχει την τιμή true, το αποτέλεσμα που θα επιστραφεί θα είναι σε καθαρά δυαδική μορφή (raw binary format) με μήκος 20.

 

Εναλλακτική Μέθοδος Hashing

string md5 ( string source [, bool raw_output])

Αν και η συνάρτηση sha1() συνιστάται για ένα ασφαλές hashing δεδομένων, υπάρχει και ένας άλλος δημοφιλής αλγόριθμος, ο MD5 (Message Digest). Η συνάρτηση md5() δημιουργεί ένα data hash με τον ίδιο ακριβώς τρόπο με τη συνάρτηση sha1(), αλλά με τη διαφορά ότι έχει μήκος 32 bytes. Επειδή η συνάρτηση sha1() δημιουργεί μεγαλύτερο αποτέλεσμα, είναι λιγότερο πιθανό να υπάρξει σύγκρουση (collision), δηλ. μια κατάσταση όπου από δύο διαφορετικά strings παράγεται το ίδιο αποτέλεσμα hash. Όμως, η συνάρτηση md5() έχει ένα ελαφρύ πλεονέκτημα στην ταχύτητα. Η χρήση της συνάρτησης md5() είναι παρόμοια μ’ αυτήν της sha1() :

<?php

$md5hash = md5("Florina per sempre");

print $md5hash;

?>

Το αποτέλεσμα από την εκτέλεση του παραπάνω script είναι το εξής :

941e140d85130454eef58a8dd21b140d

 

Απόκρυψη και Εμφάνιση των Slashes

string addslashes ( string source)

string stripslashes ( string source)

Πολύ συχνά συναντάμε καταστάσεις όπου τα μονά εισαγωγικά (single quotes '), τα διπλά εισαγωγικά (double quotes ") και ο χαρακτήρας της ανάποδης καθέτου (backslash \) μπορούν να δημιουργήσουν προβλήματα σε βάσεις δεδομένων ή και σ’ άλλα αρχεία και πρωτόκολλα. Μπορούμε να τους αποκρύψουμε αν βάλουμε ως πρόθεμα (escape) τον χαρακτήρα ανάποδης καθέτου (\), ώστε να προκύψουν τα \', \" και \\, αντίστοιχα.

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

<?php

$string = "I'm a lumberjack and I'm okay!";

$a = addslashes($string);

$b = addslashes($a);

$c = addslashes($b);

print $a . "<br />";

print $b . "<br />";

print $c . "<br />";

?>

Αν εκτελέσουμε τον παραπάνω κώδικα θα πάρουμε το εξής αποτέλεσμα :

I\'m a lumberjack and I\'m okay!

I\\\'m a lumberjack and I\\\'m okay!

I\\\\\\\'m a lumberjack and I\\\\\\\'m okay!

Ο λόγος που υπάρχουν τόσο πολλά slashes είναι γιατί η PHP προσθέτει ένα slash πριν από κάθε single ή double quote αλλά προσθέτει κι άλλα slashes πριν από τα slashes που προστέθηκαν νωρίτερα. Υπάρχει και η συνάρτηση stripslashes(), η οποία αφαιρεί τα slashes. Αν εκτελέσουμε τον προηγούμενο κώδικα ανάποδα, θα έχουμε το εξής :

<?php

$c = "I\\\\\\\'m a lumberjack and I\\\\\\\'m okay!";

$d = stripslashes($c);

$e = stripslashes($d);

$f = stripslashes($e);

print $d . "<br />";

print $e . "<br />";

print $f . "<br />";

?>

Αν εκτελέσουμε τον παραπάνω κώδικα θα πάρουμε το εξής αποτέλεσμα :

I\\'m a lumberjack and I\\'m okay!

I\'m a lumberjack and I\'m okay!

I'm a lumberjack and I'm okay!

 

Μορφοποιημένη Εκτύπωση Αριθμών

string number_format ( float number [, int decimal_places])

string number_format ( float number, int decimal_places, string decimal_point, string thousands_seperator)

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

Έτσι, αν μεταβιβάσουμε στη συνάρτηση number_format() την παράμετρο "1234567", θα επιστρέψει τον αριθμό "1,234,567". Εξ ορισμού, η συνάρτηση στρογγυλοποιεί τα δεκαδικά, δηλ. το 1234567.89 γίνεται 1,234,568. Μπορούμε να το αλλάξουμε αυτό, αν ορίσουμε τη δεύτερη παράμετρο, η οποία δηλώνει τον αριθμό των δεκαδικών ψηφίων που θα εμφανισθούν. Με την τρίτη παράμετρο μπορούμε να επιλέξουμε τον χαρακτήρα που θα χρησιμοποιηθεί ως υποδιαστολή (decimal point) και με την τέταρτη παράμετρο μπορούμε να επιλέξουμε τον χαρακτήρα που θα χρησιμοποιηθεί για τον διαχωρισμό των χιλιάδων (thousands separator). Ακολουθεί ένα χαρακτηριστικό παράδειγμα :

<?php

$num = 12345.6789;

$a = number_format($num);

$b = number_format($num, 3);

$c = number_format($num, 4, ',', '.');

print $a . "<br />";

print $b . "<br />";

print $c . "<br />";

?>

Αν εκτελέσουμε τον παραπάνω κώδικα θα πάρουμε το εξής αποτέλεσμα :

12,346
12,345.679
12.345,6789

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

 

Αφαίρεση των HTML Tags από ένα String

string strip_tags ( string source [, string allowable_tags])

Με τη συνάρτηση strip_tags() μπορούμε να αφαιρέσουμε όλα τα HTML και PHP tags από ένα string, που είναι η πρώτη παράμετρος, αλλά μπορούμε να χρησιμοποιήσουμε και μια προαιρετική δεύτερη παράμετρο για να καθορίσουμε μια λίστα από HTML tags που δεν θέλουμε να επηρεάσουμε. Η συνάρτηση μπορεί να φανεί πολύ χρήσιμη αν σκοπεύουμε να εμφανίσουμε σε μια ιστοσελίδα καταχωρήσεις χρηστών. Για παράδειγμα, αν δημιουργήσουμε ένα δικό μας messageboard forum, ένας χρήστης θα μπορεί να καταχωρήσει το εξής : <h1>Προσβλητικό Μήνυμα</h1>, το οποίο θα εμφανισθεί με μεγάλα γράμματα. Ακολουθεί ένα χαρακτηριστικό παράδειγμα :

<?php

$input = "<blink><strong>Hello!</strong></blink>";

$a = strip_tags($input);

$b = strip_tags($input, "<strong><em>");

print $a . "<br />";

print $b . "<br />";

?>

Αν εκτελέσουμε τον παραπάνω κώδικα θα πάρουμε το εξής αποτέλεσμα :

Hello!
Hello!

Η μεταβλητή $a θα έχει την τιμή "Hello!", ενώ η μεταβλητή $b θα έχει την τιμή "<strong>Hello!</strong>" επειδή βάλαμε το <strong> στη λίστα των αποδεκτών tags.

 

Σύγκριση Strings

int strcmp ( string str1, string str2)

int strcasecmp ( string str1, string str2)

Η συνάρτηση strcmp() και η αντίστοιχή της case-insensitive συνάρτηση strcasecmp() αποτελούν έναν γρήγορο τρόπο σύγκρισης δύο λέξεων για να γνωρίζουμε αν είναι ίδιες ή αν η μια προηγείται αλφαβητικά από την άλλη. Δέχεται δύο λέξεις για τις δύο παραμέτρους της και επιστρέφει την τιμή -5 αν η πρώτη λέξη προηγείται αλφαβητικά από τη δεύτερη λέξη, την τιμή 5 αν η πρώτη λέξη έπεται αλφαβητικά από τη δεύτερη λέξη και την τιμή 0 αν οι δύο λέξεις είναι ίδιες. Ακολουθεί ένα παράδειγμα :

<?php

$string1 = "florina";

$string2 = "amyntaio";

$result = strcmp($string1, $string2);

switch ($result) {

case -5: print "Η florina προηγείται του amyntaio"; break;

case 0: print "florina  και amyntaio είναι ίδιες"; break;

case 5: print "Η florina έπεται του amyntaio"; break;

}

?>

Όπως μπορούμε να δούμε, η συνάρτηση strcmp() μπορεί να χρησιμοποιηθεί αντί για τον τελεστή σύγκρισης ==. Και οι δύο τρόποι σύγκρισης strings είναι το ίδιο γρήγοροι και μπορούμε να τους χρησιμοποιούμε ισότιμα. Πρέπει, όμως, να έχουμε υπόψη μας ότι ο τελεστής == επιστρέφει την τιμή "1" αν τα δύο strings είναι ίδια, ενώ η συνάρτηση strcmp() επιστρέφει την τιμη 0.

 

Γέμισμα (Padding) ενός String

string str_pad ( string input, int pad_length [, string pad_string [, int pad_type]])

Η συνάρτηση str_pad() κάνει ένα string, που η πρώτη παράμετρος της συνάρτησης, μεγαλύτερο κατά X χαρακτήρες, που είναι η δεύτερη παράμετρος, προσθέτοντας κενά. Ακολουθεί ένα παράδειγμα :

<?php

$string = "Goodbye, Perl!";

$newstring = str_pad($string, 10);

print $newstring;

?>

Ο παραπάνω κώδικας θα βάλει το κείμενο "     Goodbye, Perl!     " στο $newstring, που είναι το ίδιο με το κείμενο του $string εκτός από τα 5 κενά που υπάρχουν σε κάθε πλευρά, για να κατανεμηθούν τα 10 κενά που όρισε η δεύτερη παράμετρος. Η συνάρτηση str_pad() διαθέτει μια προαιρετική τρίτη παράμετρο με την οποία μπορούμε να ορίσουμε τον χαρακτήρα γεμίσματος (padding character), ως εξής :

<?php

$string = "Goodbye, Perl!";

$newstring = str_pad($string, 10, 'a');

print $newstring;

?>

Ο παραπάνω κώδικας θα βάλει το κείμενο "aaaaaGoodbye, Perl!aaaaa" στο $newstring. Μπορούμε να χρησιμοποιήσουμε και την τέταρτη προαιρετική παράμετρο της συνάρτησης, με την οποία μπορούμε να προσδιορίσουμε σε ποια πλευρά θέλουμε να γίνει το γέμισμα. Η τέταρτη παράμετρος είναι σταθερά και μπορεί να πάρει τις εξής τιμές : STR_PAD_LEFT, STR_PAD_RIGHT ή STR_PAD_BOTH. Ακολουθεί ένα παράδειγμα :

<?php

$string = "Goodbye, Perl!";

$a = str_pad($string, 10, '-', STR_PAD_LEFT);

$b = str_pad($string, 10, '-', STR_PAD_RIGHT);

$c = str_pad($string, 10, '-', STR_PAD_BOTH);

print $a. "<br />";

print $b."<br />";

print $c."<br />";

?>

Ο παραπάνω κώδικας θα τοποθετήσει στο $a το κείμενο "----------Goodbye, Perl!", στο $b το κείμενο "Goodbye, Perl!----------" και στο $c το κείμενο "-----Goodbye, Perl!-----". Δεν θα πρέπει να ξεχνάμε ότι η HTML επιτρέπει ένα μόνο κενό κάθε φορά και έτσι αν θέλουμε να γεμίσουμε με πολλά κενά, θα πρέπει να χρησιμοποιήσουμε τον HTML κώδικα &nbsp; (non-breaking space).

 

Σύνθετη Εκτύπωση Strings

void printf ( string format [, mixed args [, mixed ...]])

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

<?php

$a = "λιοντάρια, τίγρεις και αρκούδες";

printf("Υπάρχουν %s - Θεέ μου!", $a);

?>

Ο παραπάνω κώδικας θα εμφανίσει το μήνυμα "Υπάρχουν λιοντάρια, τίγρεις και αρκούδες - Θεέ μου!". Το %s είναι ένα ειδικό string μορφοποίησης που σημαίνει ότι ακολουθεί μια παράμετρος κειμένου (string). Ακολουθεί ένα πιο πολύπλοκο παράδειγμα :

<?php

$a = "Florina";

$b = "per";

$c = "sempre";

printf("Θα εμφανισθεί το μήνυμα : %s %s %s!", $a, $b, $c);

?>

Αυτή τη φορά έχουμε πολλούς μορφοποιητές (formatters) του τύπου %s και τον αντίστοιχο αριθμό μεταβλητών (παραμέτρων). Η PHP αντικαθιστα το πρώτο %s με τη δεύτερη παράμετρο, το δεύτερο %s με την τρίτη παράμετρο και το τρίτο %s με την τέταρτη παράμετρο. Ο παραπάνω κώδικας θα εμφανίσει το μήνυμα "Θα εμφανισθεί το μήνυμα : Florina per sempre! ". Η συνάρτηση printf() χρησιμοποιεί πολλά strings μορφοποίησης, εκτός από το %s :

Format

Ενέργεια

%%

Εμφάνιση του χαρακτήρα %.

%b

Η παράμετρος είναι ένας ακέραιος (integer) και εμφανίζεται σε δυαδική μορφή (binary).

%c

Η παράμετρος είναι ένας ακέραιος (integer) και εμφανίζεται ως χαρακτήρας με την αντίστοιχη τιμή ASCII.

%d

Η παράμετρος είναι ένας ακέραιος (integer) και εμφανίζεται ως αρθμός με πρόσημο (signed number).

%f

Η παράμετρος είναι ένας αριθμός κινητής υποδιαστολής (float) και εμφανίζεται έτσι.

%o

Η παράμετρος είναι ένας ακέραιος (integer) και εμφανίζεται σε οκταδική μορφή (octal).

%s

Η παράμετρος είναι ένα string και εμφανίζεται ως string.

%x

Η παράμετρος είναι ένας ακέραιος (integer) και εμφανίζεται σε δεκαεξαδική μορφή (hexadecimal) με πεζά γράμματα.

%X

Η παράμετρος είναι ένας ακέραιος (integer) και εμφανίζεται σε δεκαεξαδική μορφή (hexadecimal) με κεφαλαία γράμματα.

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

<?php

$number = 123;

printf("Ο αριθμός 123 σε δυαδική μορφή : %b<br>", $number);

printf("Ο αριθμός 123 σε 16δική μορφή : %x<br>", $number);

printf("Ο αριθμός 123 ως string : %s<br>", $number);

printf("Εκτύπωση του χαρακτήρα %%<br>");

?>

Ο παραπάνω κώδικας θα εμφανίσει τα εξής :

Ο αριθμός 123 σε δυαδική μορφή : 1111011

Ο αριθμός 123 σε 16δική μορφή : 7b

Ο αριθμός 123 ως string : 123

Εκτύπωση του χαρακτήρα %

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

<?php

$number = 123.456;

$formatted = number_format($number, 2) . "<br>";

print "Ο αριθμός μορφοποιημένος : $formatted";

printf("Ο αριθμός μορφοποιημένος : %.2f", $number);

?>

Ο παραπάνω κώδικας θα εμφανίσει τα εξής :

Ο αριθμός μορφοποιημένος : 123.46

Ο αριθμός μορφοποιημένος : 123.46

Βλέπουμε ότι μπορούμε να εμφανίσουμε έναν πραγματικό (float) αριθμό με συγκεκριμένο αριθμό δεκαδικών θέσεων με χρήση τόσο της συνάρτησης number_format() όσο και της printf(). Το string μορφοποίησης %f σημαίνει "float" και το .2 σημαίνει στρογγυλοποίηση του αποτελέσματος σε 2 δεκαδικές θέσεις.

 

Ανάλυση String σε Μεταβλητές

void parse_str ( string input [, array store])

Είδαμε στα προηγούμενα τη μεταβλητή QUERY_STRING, η οποία περιέχει το κείμενο που στέλνεται μετά από το σύμβολο ? σε μια αίτηση (request) του τύπου HTTP GET. Αυτό σημαίνει με απλά λόγια ότι αν η ιστοσελίδα που επισκεφθήκαμε ήταν η "mypage.php?a=Florina&b=Amyntaio", τότε το QUERY_STRING θα έχει την τιμή "a=Florina&b=Amyntaio".

Η συνάρτηση parse_str() λαμβάνει ένα query string όπως το παραπάνω και το μετατρέπει σε μεταβλητές, όπως ακριβώς κάνει και η PHP. Η διαφορά είναι ότι οι μεταβλητές που αναλύονται με τη συνάρτηση parse_str() μετατρέπονται σε καθολικές (global), σ’ αντίθεση με τα στοιχεία που βρίσκονται μέσα στο $_GET. Ακολουθεί ένα χαρακτηριστικό παράδειγμα :

<?php

if (isset($a)) {

print "Η μεταβλητή a έχει την τιμή $a<br />";

} else {

print "Η μεταβλητή a δεν έχει ορισθεί<br />";

}

parse_str("a=Florina&b=Amyntaio");

if (isset($a)) {

print "Η μεταβλητή a έχει την τιμή $a<br />";

} else {

print "Η μεταβλητή a δεν έχει ορισθεί<br />";

}

?>

Ο παραπάνω κώδικας θα εμφανίσει τα εξής :

Η μεταβλητή a δεν έχει ορισθεί

Η μεταβλητή a έχει την τιμή Florina

Αυτό συμβαίνει επειδή η κλήση στη συνάρτηση parse_str() θα δώσει στη μεταβλητή $a την τιμή "Florina" και στη μεταβλητή $b την τιμή "Amyntaio". Προαιρετικά, μπορούμε να περάσουμε έναν πίνακα (array) ως τη δεύτερη παράμετρο στη συνάρτηση parse_str() για να βάλει εκεί τις μεταβλητές. Το script θα είναι ως εξής :

<?php

$array = array();

if (isset($array['a'])) {

print "Η μεταβλητή a έχει την τιμή {$array['a']}<br />";

} else {

print "Η μεταβλητή a δεν έχει ορισθεί<br />";

}

parse_str("a=Florina&b=Amyntaio", $array);

if (isset($array['a'])) {

print "Η μεταβλητή a έχει την τιμή {$array['a']}<br />";

} else {

print "Η μεταβλητή a δεν έχει ορισθεί<br />";

}

?>

Ο παραπάνω κώδικας θα εμφανίσει τα εξής :

Η μεταβλητή a δεν έχει ορισθεί

Η μεταβλητή a έχει την τιμή Florina

Το script αυτό εμφανίζει τα ίδια με το προηγούμενο με τη διαφορά ότι οι μεταβλητές που υπάρχουν στο query string βρίσκονται τώρα μέσα στον πίνακα $array. Τα ονόματα των μεταβλητών χρησιμοποιούνται ως κλειδιά (keys) στον πίνακα και οι τιμές τους χρησιμοποιούνται ως οι τιμές του πίνακα.

 

Οι Κανονικές Εκφράσεις (Regular Expressions)

Οι κανονικές εκφράσεις (regular expressions), που είναι γνωστές και με τον όρο regexps, μας προσφέρουν περισσότερο έλεγχο στον χειρισμό των strings, αλλά είναι αρκετά πολύπλοκες στη σύνταξή τους. Κανονικές εκφράσεις μπορεί να έχουμε ήδη χρησιμοποιήσει οι περισσότεροι από εμάς, όπως για παράδειγμα την "rm *.txt", για να διαγράψουμε όλα τα αρχεία που έχουν επέκταση .txt ή και την florina?.jpg για να ψάξουμε όλα τα αρχεία εικόνας που το όνομά τους ξεκινά με το κείμενο florina, μετά περιέχει έναν οποιονδήποτε χαρακτήρα και επέκταση jpg.

 

Ταίριασμα Strings με Κανονικές Εκφράσεις

int preg_match ( string pattern, string subject [, array matches [, int flags [, int offset]]])

int preg_match_all ( string pattern, string subject [, array matches [, int flags [, int offset]]])

Η συνάρτηση preg_match() λαμβάνει δύο παραμέτρους, το υπόδειγμα (pattern) για το ταίριασμα και το string με το οποίο θα γίνει η σύγκριση. Η συνάρτηση εφαρμόζει την κανονική έκφραση που υπάρχει στην πρώτη παράμετρο στο string που υπάρχει στη δεύτερη παράμετρο και αν βρεθεί ταίριασμα επιστρέφει την τιμή 1, αλλιώς επιστρέφει την τιμή 0. Επιστρέφει την τιμή 1 καθώς η συνάρτηση σταματάει μόλις βρεθεί το πρώτο ταίριασμα στο string. Υπάρχει και η εναλλακτική συνάρτηση preg_ match_all(), η οποία δεν σταματάει μόλις βρεθεί το πρώτο ταίριασμα.

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

Κανονική Έκφραση

String

Αποτέλεσμα

php/

php

Λάθος, θα πρέπε να υπάρχει το σύμβολο / στην αρχή της κανονικής έκφρασης

/php/

php

Ταίριασμα

/php/

PHP

Χωρίς ταίριασμα καθώς οι κανονικές εκφράσεις είναι case sensitive

/php/i

PHP

Ταίριασμα, το /i σημαίνει "case insensitive"

/Florina/i

FLORINA

Ταίριασμα

Το "i" είναι ο τροποποιητής (modifier) για να είναι η κανονική έκφραση case insensitive. Ακολουθεί ένα παράδειγμα κώδικα με κανονικές εκφράσεις και τη συνάρτηση preg_match() :

<?php

if (preg_match("/php/", "php")) {

print "Βρέθηκε ταίριασμα!<br>";

}

if (preg_match("/php/", "PHP")) {

print "Βρέθηκε ταίριασμα!<br>";

}  else {

print "Χωρίς ταίριασμα!<br>";

}

if (preg_match("/php/i", "Php")) {

print "Βρέθηκε ταίριασμα!<br>";

}

?>

Ο παραπάνω κώδικας θα εμφανίσει τα εξής :

Βρέθηκε ταίριασμα!

Χωρίς ταίριασμα!

Βρέθηκε ταίριασμα!

Όπως βλέπουμε, η πρώτη και η τρίτη εντολή θα εμφανίσουν το μήνυμα ότι βρέθηκε ταίριασμα, ενώ η δεύτερη θα εμφανίσει το μήνυμα ότι δεν βρέθηκε ταίριασμα καθώς λείπει ο τροποποιητής "i".

 

Απλές Κανονικές Εκφράσεις

Με τις κανονικές εκφράσεις μπορούμε να σχηματίσουμε σύνολα από γράμματα με τις αγκύλες [ και ]. Για παράδειγμα, το σύνολο [Ff] θα ταιριάζει με το "F" ή με το "f". Μπορούμε επίσης να χρησιμοποιήσουμε σύνολα για να προσδιορίσουμε μια περιοχή, όπως για παράδειγμα το [A-Z] που δέχεται όλα τα κεφαλαία γράμματα, το [A-Za-z] που δέχεται όλα τα γράμματα (πεζά και κεφαλαία) και το [a-z0-9] που δέχεται μόνο τα πεζά γράμματα αλλά και τα 10 ψηφία.

Το σύμβολο Ù (caret) σημαίνει άρνηση (not) και έτσι το σύνολο [ÙA-Z] δέχεται ο,τιδήποτε δεν είναι κεφαλαίο γράμμα και το σύνολο [ÙA-Za-z0-9] δέχεται μόνο σύμβολα, δηλ. όχι κεφαλαία γράμματα, όχι πεζά γράμματα και όχι αριθμούς. Ακολουθεί μια λίστα με απλές κανονικές εκφράσεις, κάποια strings και το αποτέλεσμα, αν δηλαδή βρέθηκε ή όχι κάποιο ταίριασμα.

Κανονική Έκφραση

String

Αποτέλεσμα

/[Ff]oo/

Foo

Ταίριασμα

/[ÙFf]oo/

Foo

Χωρίς ταίριασμα

/[A-Z][0-9]/

K9

Ταίριασμα

/[A-S]esting/

Testing

Χωρίς ταίριασμα

/[A-T]esting/

Testing

Ταίριασμα

/[a-z]esting[0-9][0-9]/

TestingAA

Χωρίς ταίριασμα

/[a-z]esting[0-9][0-9]/

testing99

Ταίριασμα

/[a-z]esting[0-9][0-9]/

Testing99

Χωρίς ταίριασμα

/[a-z]esting[0-9][0-9]/i

Testing99

Ταίριασμα

/[Ùa-z]esting/

Testing

Ταίριασμα

/[Ùa-z]esting/i

Testing

Χωρίς ταίριασμα και αυτό γιατί ο τροποποιητής "i" κάνει την έκφραση να είναι case insensitive και έτσι το [Ùa-z] μετατρέπεται σε [Ùa-zA-Z]

 

Προχωρημένες Κανονικές Εκφράσεις

Στις κανονικές εκφράσεις μπορούμε να χρησιμοποιήσουμε και τους χαρακτήρες +, *, ?, { }, $ και Ù, που αναγράφονται εκτός των συνόλων και που έχουν ειδικό νόημα. Τα τέσσερα πρώτα επηρεάζουν τον αριθμό των προτύπων που θα ταιριάζουν και τα δύο τελευταία επηρεάζουν τη θέση. Το + σημαίνει ταίριασμα με μία ή περισσότερες από την προηγούμενη έκφραση, το * σημαίνει ταίριασμα με καμία ή περισσότερες από την προηγούμενη έκφραση και το ? σημαίνει ταίριασμα με καμία ή μόνο μία από την προηγούμενη έκφραση. Ακολουθούν μερικά παραδείγματα :

<?php

preg_match("/[A-Za-z]*/", $string);

preg_match("/-?[0-9]+/", $string);

preg_match("/\$[A-Za-z_][A-Za-z_0-9]*/", $string);

?>

Η πρώτη έκφραση θα ταιριάξει με τις εκφράσεις "", "a", "aaaa", "The sun has got his hat on" και μοποιοδήποτε string που περιέχει κεφαλαία και πεζά γράμματα. Η δεύτερη κανονική έκφραση θα ταιριάξει με τα 1, 100, 324343995 και με τα -1, -100, -234011 κοκ, όπου το "-?" σημαίνει ταίριασμα με 0 ή 1 σύμβολα -.

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

mixed preg_replace ( mixed pattern, mixed replacement, mixed input [, int limit])

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

<?php

$a = "Foo moo boo tool foo";

$b = preg_replace("/[A-Za-z]oo\b/", "Got word: $0 ", $a);

print $b;

?>

Το αποτέλεσμα θα είναι το εξής :

Got word: Foo Got word: moo Got word: boo tool Got word: foo

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

<?php

$a = "Foo moo boo tool foo";

$b = preg_replace("/[A-Za-z]oo\b/e", 'strtoupper("$0")', $a, 2);

print $b;

?>

Το αποτέλεσμα θα είναι το εξής :

FOO MOO boo tool foo

Έγιναν μόνο οι δύο πρώτες αντικαταστάσεις.

 

Συνοπτικά Παραδείγματα με Κανονικές Εκφράσεις

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

Έκφραση

Ταίριασμα με

foo

Το string "foo"

Ùfoo

Το "foo" στην αρχή μιας γραμμής

foo$

Το "foo" στο τέλος μιας γραμμής

Ùfoo$

Το "foo" όταν είναι μόνο του σε μια γραμμή

[Ff]oo

"Foo" ή "foo"

[abc]

a, b ή c

[Ùabc]

d, e, f, g, h …, δηλ. ο,τιδήποτε δεν είναι a, b ή c

[A-Z]

Ένα οποιοδήποτε κεφαλαίο γράμμα

[a-z]

Ένα οποιοδήποτε πεζό γράμμα

[A-Za-z]

Ένα οποιοδήποτε γράμμα

[A-Za-z0-9]

Ένα οποιοδήποτε γράμμα ή ψηφίο

[A-Z]+

Ένα ή περισσότερα κεφαλαία γράμματα

[A-Z]*

Κανένα ή περισσότερα κεφαλαία γράμματα

[A-Z]?

Κανένα ή ένα κεφαλαίο γράμμα

[A-Z]{3}

3 κεφαλαία γράμματα

[A-Z]{3,}

Το ελάχιστο 3 κεφαλαία γράμματα

[A-Z]{1,3}

1 έως 3 κεφαλαία γράμματα

[Ù0-9]

Ένας μη αριθμητικός χαρακτήρας

[Ù0-9A-Za-z]

Ένα σύμβολο, αλλά όχι αριθμός και όχι γράμμα

Fo*

F, Fo, Foo, Fooo, Foooo κλπ

Fo+

Fo, Foo, Fooo, Foooo κλπ

Fo?

F, Fo

Ù

Ένας οποιοσδήποτε χαρακτήρας εκτός από τον \n (new line)

\b

Π.χ., το te\b ταιριάζει με το "te" στο "late" αλλά όχι και με το "te" στο "tell".

\B

Π.χ., το "te\B" ταιριάζει με το "te" στο "tell" αλλά όχι και με το "te" στο "late".

\n

Χαρακτήρας νέας γραμμής (new line character)

\s

Ένας λευκός χαρακτήρας (whitespace), όπως new line, space, tab κλπ

\S

Ένας μη λευκός χαρακτήρας


 

back.gif (9867 bytes)

Επιστροφή