1. Direkter Zugriff auf den Index des Zeichens
Will man das erste oder letzte Zeichen eines Strings auslesen, dann ist es der einfachste Weg, auf diesen zuzugreifen als wäre er ein Array. Die Schreibweise lautet dann $string[index], wobei „index” ein Integer-Wert zwischen 0 und n ist (n entspricht der String-Länge). Entsprechend gibt $string[0] das erste Zeichen des Strings zurück. Das letzte Zeichen hat den Index Länge($string) - 1. Die Länge des Strings kann mit der Funktion strlen($string) bestimmt werden. Dass 1 subtrahiert werden muss kann leicht anhand eines Strings mit nur einem Zeichen hergeleitet werden. In diesem hat das einzige Zeichen den Index 0 (da die Indexierung bei 0 beginnt), die Länge ist aber 1. Das nächste Beispiel stellt sowohl den Zugriff auf das erste als auch das letzte Zeichen dar:
<?php $str = 'Dies ist ein Beispielstring.'; $firstChr = $str[0]; $lastChr = $str[strlen($str)-1]; var_dump($firstChr, $lastChr); ?>
string(1) "D" string(1) "."
Vorsichtig muss man aber sein, wenn der String auch leer sein kann. Dann führen beide Abfragen nämlich zu Fehlern:
<?php $str = ''; $firstChr = $str[0]; $lastChr = $str[strlen($str)-1]; var_dump($firstChr, $lastChr); ?>
<br /> <b>Notice</b>: Uninitialized string offset: 0 in <b>...\test.php</b> on line <b>3</b><br /> <br /> <b>Notice</b>: Uninitialized string offset: -1 in <b>...\test.php</b> on line <b>4</b><br /> string(0) "" string(0) ""
2. UTF-8 und Index-Zugriff
Der direkte Zugriff per Index ist nicht multibyte-sicher. Bei Zeichen, die aus mehreren Byte bestehen, gibt es daher Probleme. Das betrifft die meisten UTF-8-Zeichen. Hier wird dies am Zeichen „α” dargestellt. Greift man auf dieses per Index zu, dann erhält man nicht „α” zurück, sondern dessen erstes oder letztes Byte.
<?php mb_internal_encoding('UTF-8'); $str = 'αDies ist ein Beispielstring mit UTF-8α'; $firstChr = $str[0]; $lastChr = $str[strlen($str)-1]; // hier mit htmlentities, um keine speziellen Sonderzeichen zu erhalten, die nur bedingt dargestellt werden koennen var_dump(htmlentities($firstChr), htmlentities($lastChr)); ?>
string(7) "Î" string(8) "±"
3. UTF-8 und mb_substr()
Um das zuvor genannte Problem zu umgehen und multibyte-sicher das erste oder letzte Zeichen auszulesen, kann mb_substr($str, $start, $length) verwendet werden. Diese Funktion gibt den Abschnitt des Strings $str zurück, der beim Index $start beginnt und beim Index $start+$length endet. Das letzte Zeichen ist nicht einschließlich, $start=x und $length=1 liefert daher exakt das Zeichen mit Index x. Es kann auch ein negativer Wert für $start übergeben werden. Dies wird dann interpretiert als Länge($string) - x für $start=-x. Das nächste Beispiel illustriert die Anwendung von mb_substr():
<?php mb_internal_encoding('UTF-8'); $str = 'αDies ist ein Beispielstring mit UTF-8α'; $firstChr = mb_substr($str, 0, 1); $lastChr = mb_substr($str, -1, 1); var_dump($firstChr, $lastChr); ?>
string(2) "α" string(2) "α"
Ein Vorteil von mb_substr() ist die erhöhte Flexibilität. Indem $length erhöht wird, können mit Leichtigkeit auch mehrere Zeichen ausgelesen werden — statt nur das erste/letzte.
<?php mb_internal_encoding('UTF-8'); $str = 'αDies ist ein Beispielstring mit UTF-8α'; $firstChars = mb_substr($str, 0, 4); $lastChars = mb_substr($str, -4, 4); var_dump($firstChars, $lastChars); ?>
string(5) "αDie" string(5) "F-8α"
4. Eigene Funktionen für die ersten/letzten n Zeichen
Im nächsten Beispiel werden zwei Funktionen definiert, welche die ersten (getFirstChars()) oder letzten (getLastChars()) n Zeichen zurückgeben. Die Implementierung ist trivial, da die Parameter der beiden Funktionen nur richtig an mb_substr() weitergegeben werden müssen. Der Wert der Funktionen ergibt sich daher in erster Linie aus der klareren Benennung.
<?php mb_internal_encoding('UTF-8'); function getFirstChars($str, $length) { return mb_substr($str, 0, $length); } function getLastChars($str, $length) { return mb_substr($str, -$length, $length); } $str1 = 'αDies ist ein Beispielstring mit UTF-8α'; var_dump(getFirstChars($str1, 4), getLastChars($str1, 4)); // "αDie" und "F-8α" $str2 = '12345'; var_dump(getFirstChars($str2, 4), getLastChars($str2, 4)); // "1234" und "2345" $str3 = ''; var_dump(getFirstChars($str3, 4), getLastChars($str3, 4)); // "" und "" (da $str3 leer ist) $str4 = 'test'; var_dump(getFirstChars($str4, 0), getLastChars($str4, 0)); // "" und "" (da jeweils length=0) ?>
string(5) "αDie" string(5) "F-8α" string(4) "1234" string(4) "2345" string(0) "" string(0) "" string(0) "" string(0) ""