Καθώς έφτιαχνα μία εφαρμογή, χρειάστηκε να χρησιμοποιήσω τις multibyte functions (που υποστηρίζουν χαρακτήρες πολλαπλών bytes) της php. Συγκεκριμένα, χρησιμοποιούσα κωδικοποίηση utf-8 για την υποστήριξη ελληνικών χαρακτήρων, και χρειάστηκε να χρησιμοποιήσω την αντίστοιχη function της strtok() για να κομματιάσω μία σειρά Ελληνικών χαρακτήρων. Ψάχνοντας τον οδηγό χρήσης της PHP βρήκα σχεδόν κάθε άλλη function, εκτός από αυτή που χρειαζόμουν, οπότε αποφάσισα να δημιουργήσω την δική μου. Την μοιράζομαι μαζί σας, μιας που ούτε το Google θα σας βοηθήσει σε αυτήν την περίπτωση.
function mb_strtok($delimiters, $str=NULL) { static $pos = 0; // Κρατά την θέση στο string για τις επόμενες κλήσεις της function. static $string = ""; // Εάν υπάρχει νέο string, επανέφερε στις αρχικές τιμές τις στατικές παραμέτρους. if($str!=NULL) { $pos = 0; $string = $str; } // Αρχικοποίηση του κομματιού. $token = ""; while ($pos < mb_strlen($string)) { $char = mb_substr($string, $pos, 1); $pos++; if(mb_strpos($delimiters, $char)===FALSE) { $token .= $char; } else { // Να μην επιστραφούν άδεια strings. if($token!="") return $token; } } // Έλεγξε εάν είναι το τελευταίο κομμάτι που πρέπει να επιστραφεί. if ($token!="") { return $token; } else { return false; } }
Στο πρώτο κάλεσμα της mb_strtok()
, η πρώτη παράμετρος πρέπει να είναι ένα string που περιέχει τους διαχωριστικούς χαρακτήρες, και η δεύτερη παράμετρος το string που θα κομματιαστεί. Καί οι δύο παράμετροι μπορούν να περιέχουν multibyte χαρακτήρες.
Η δεύτερη κλήση της mb_strtok()
πρέπει να έχει μόνο την πρώτη παράμετρο, δηλαδή το string που περιέχει τους διαχωριστικούς χαρακτήρες.
Καλώντας την mb_strtok()
ξανά και με τις δύο παραμέτρους, επαναφέρει τις αρχικές ρυθμίσεις και ξεκινά νέος γύρος κομματιάσματος του νέου string.
Χρησιμοποιείτε αυτή την function όπως θα χρησιμοποιούσατε την strtok()
, για παράδειγμα μέσα σε ένα while loop. Η function επιστρέφει boolean false
όταν δεν υπάρχουν άλλα κομμάτια να επιστρέψει.
Μπορεί να προσέξατε ότι η σειρά των παραμέτρων είναι αντεστραμμένη σε σχέση με την strtok()
. Αυτό το έκανα για να κρατήσω τον κώδικα απλοποιημένο και να αποφύγω την χρήση της func_get_args()
που θα περιέπλεκε τον κώδικα.